Can not use Show even if type implements it
I do not understand why i Show typeclass complains on using a custom type since i already provided an instance for it :
Custom Type
data Numeric=I Int | D Double
instance Show Numeric where
show (I x)=show x
show (D y)=show y
instance Num Numeric where
(+) (I a) (I b) =I (a+b)
(+) (D a) (I b) =D (a+ fromIntegral b)
(+) (I a) (D b)=D (fromIntegral a+b)
(-) (D a) (I b)= D (a- fromIntegral b)
(-) (I a) (D b)=D(fromIntegral a -b)
Method that complains
arrayToString::Num a=>[a]->String
arrayToString arr =intercalate "," $ map show arr
So given my type that implements Num and Show typeclasses i do not understand why it has renders this error when i am feeding arrayToString a [Numeric] value
Error
* Could not deduce (Show a) arising from a use of `show'
from the context: Num a
bound by the type signature for:
arrayToString :: forall a. Num a => [a] -> String
at Types.hs:40:5-37
Possible fix:
add (Show a) to the context of
the type signature for:
arrayToString :: forall a. Num a => [a] -> Strin
haskell typeclass
add a comment |
I do not understand why i Show typeclass complains on using a custom type since i already provided an instance for it :
Custom Type
data Numeric=I Int | D Double
instance Show Numeric where
show (I x)=show x
show (D y)=show y
instance Num Numeric where
(+) (I a) (I b) =I (a+b)
(+) (D a) (I b) =D (a+ fromIntegral b)
(+) (I a) (D b)=D (fromIntegral a+b)
(-) (D a) (I b)= D (a- fromIntegral b)
(-) (I a) (D b)=D(fromIntegral a -b)
Method that complains
arrayToString::Num a=>[a]->String
arrayToString arr =intercalate "," $ map show arr
So given my type that implements Num and Show typeclasses i do not understand why it has renders this error when i am feeding arrayToString a [Numeric] value
Error
* Could not deduce (Show a) arising from a use of `show'
from the context: Num a
bound by the type signature for:
arrayToString :: forall a. Num a => [a] -> String
at Types.hs:40:5-37
Possible fix:
add (Show a) to the context of
the type signature for:
arrayToString :: forall a. Num a => [a] -> Strin
haskell typeclass
add a comment |
I do not understand why i Show typeclass complains on using a custom type since i already provided an instance for it :
Custom Type
data Numeric=I Int | D Double
instance Show Numeric where
show (I x)=show x
show (D y)=show y
instance Num Numeric where
(+) (I a) (I b) =I (a+b)
(+) (D a) (I b) =D (a+ fromIntegral b)
(+) (I a) (D b)=D (fromIntegral a+b)
(-) (D a) (I b)= D (a- fromIntegral b)
(-) (I a) (D b)=D(fromIntegral a -b)
Method that complains
arrayToString::Num a=>[a]->String
arrayToString arr =intercalate "," $ map show arr
So given my type that implements Num and Show typeclasses i do not understand why it has renders this error when i am feeding arrayToString a [Numeric] value
Error
* Could not deduce (Show a) arising from a use of `show'
from the context: Num a
bound by the type signature for:
arrayToString :: forall a. Num a => [a] -> String
at Types.hs:40:5-37
Possible fix:
add (Show a) to the context of
the type signature for:
arrayToString :: forall a. Num a => [a] -> Strin
haskell typeclass
I do not understand why i Show typeclass complains on using a custom type since i already provided an instance for it :
Custom Type
data Numeric=I Int | D Double
instance Show Numeric where
show (I x)=show x
show (D y)=show y
instance Num Numeric where
(+) (I a) (I b) =I (a+b)
(+) (D a) (I b) =D (a+ fromIntegral b)
(+) (I a) (D b)=D (fromIntegral a+b)
(-) (D a) (I b)= D (a- fromIntegral b)
(-) (I a) (D b)=D(fromIntegral a -b)
Method that complains
arrayToString::Num a=>[a]->String
arrayToString arr =intercalate "," $ map show arr
So given my type that implements Num and Show typeclasses i do not understand why it has renders this error when i am feeding arrayToString a [Numeric] value
Error
* Could not deduce (Show a) arising from a use of `show'
from the context: Num a
bound by the type signature for:
arrayToString :: forall a. Num a => [a] -> String
at Types.hs:40:5-37
Possible fix:
add (Show a) to the context of
the type signature for:
arrayToString :: forall a. Num a => [a] -> Strin
haskell typeclass
haskell typeclass
asked Dec 31 '18 at 13:50
Bercovici AdrianBercovici Adrian
1,24011018
1,24011018
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
If you want to show something then use the Show constraint:
arrayToString :: (Show a) => [a] -> String
i do not understand why it has renders this error when i am feeding arrayToString a [Numeric] value
Notice the function arrayToString doesn't have anything specific to Num or Numeric. All it does is render a string for anything Showable (via show).
So basically if my typeAimplementsT1andT2typeclasses , and i only put a constraint forT1inside a method , it can't deduce that it implementsT2too ?
– Bercovici Adrian
Dec 31 '18 at 13:53
6
Your function,arrayToStringdoes not really have anything to do with your typeNumeric, it's just a function that rendersShowable values in a special way. It can't render values that aren't Showable andNumhas nothing to do with its operation.
– Thomas M. DuBuisson
Dec 31 '18 at 14:04
add a comment |
The problem is that you are not using your custom type.
The given type signature is arrayToString :: forall a. Num a => [a] -> String. You have universally quantified over all possible types a that are members of the Num typeclass. This includes your type but also every other numeric type that exists and ever will exist. This is too bold a statement.
You might want to consider changing the signature to arrayToList :: [Numeric] -> String, using your type directly, instead of relying on parametric polymorphism.
Also, as a side-note, is a singly linked list (or a cons-list), not an array.
EDIT: To translate this issue into logic, what you have done is to say
- There is a set of things called
Numeric
- Elements of
Numericare members of the classesNumandShow
- Therefore, for every possible type ever that is in the
Numclass, I can turn a list of that type into a string
You have drastically increased the scope of the statement so that it includes a whole bunch of types we know nothing about and have no proof that they can be turned into strings.
1
If at the compile time, all known data types which are instances ofNumtype class are also an instance ofShowtype class like in the above case, wouldn't Haskell be able to deduce this information fromNum a =>constraint alone..? What do you mean by every possible type ever..?
– Redu
Dec 31 '18 at 14:27
2
@Redu "...all known data types which are instances of Num type class are also an instance of Show type class..." This is not true in general, for example one could implement a(Num b) => Num (a -> b)instance. Haskell refuses to deduce that allNums areShows, because that may not be true later on.
– AJFarmar
Dec 31 '18 at 15:13
1
@AJFarmar Thanks for the comment. I understand and normally i wouldn't bother much and listen to the error message, just throw aShow ainto the constaints mix. Seeing this question intrigued me a little. I would normally expect GHC to process instances in advance, rendering the possiblity of an unshowableNumtype class type to pop up later. I think like, in the above example it gives the impression of unnecessarily whining while at the same time there must a certain reason while things done this way.
– Redu
Dec 31 '18 at 15:33
2
@Redu And if this is a library that may be imported by somebody else who has defined new instances GHC didn't know about at the time it created the library, what then?
– Daniel Wagner
Dec 31 '18 at 16:33
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53988227%2fcan-not-use-show-even-if-type-implements-it%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
If you want to show something then use the Show constraint:
arrayToString :: (Show a) => [a] -> String
i do not understand why it has renders this error when i am feeding arrayToString a [Numeric] value
Notice the function arrayToString doesn't have anything specific to Num or Numeric. All it does is render a string for anything Showable (via show).
So basically if my typeAimplementsT1andT2typeclasses , and i only put a constraint forT1inside a method , it can't deduce that it implementsT2too ?
– Bercovici Adrian
Dec 31 '18 at 13:53
6
Your function,arrayToStringdoes not really have anything to do with your typeNumeric, it's just a function that rendersShowable values in a special way. It can't render values that aren't Showable andNumhas nothing to do with its operation.
– Thomas M. DuBuisson
Dec 31 '18 at 14:04
add a comment |
If you want to show something then use the Show constraint:
arrayToString :: (Show a) => [a] -> String
i do not understand why it has renders this error when i am feeding arrayToString a [Numeric] value
Notice the function arrayToString doesn't have anything specific to Num or Numeric. All it does is render a string for anything Showable (via show).
So basically if my typeAimplementsT1andT2typeclasses , and i only put a constraint forT1inside a method , it can't deduce that it implementsT2too ?
– Bercovici Adrian
Dec 31 '18 at 13:53
6
Your function,arrayToStringdoes not really have anything to do with your typeNumeric, it's just a function that rendersShowable values in a special way. It can't render values that aren't Showable andNumhas nothing to do with its operation.
– Thomas M. DuBuisson
Dec 31 '18 at 14:04
add a comment |
If you want to show something then use the Show constraint:
arrayToString :: (Show a) => [a] -> String
i do not understand why it has renders this error when i am feeding arrayToString a [Numeric] value
Notice the function arrayToString doesn't have anything specific to Num or Numeric. All it does is render a string for anything Showable (via show).
If you want to show something then use the Show constraint:
arrayToString :: (Show a) => [a] -> String
i do not understand why it has renders this error when i am feeding arrayToString a [Numeric] value
Notice the function arrayToString doesn't have anything specific to Num or Numeric. All it does is render a string for anything Showable (via show).
edited Dec 31 '18 at 14:02
answered Dec 31 '18 at 13:52
Thomas M. DuBuissonThomas M. DuBuisson
55.3k689153
55.3k689153
So basically if my typeAimplementsT1andT2typeclasses , and i only put a constraint forT1inside a method , it can't deduce that it implementsT2too ?
– Bercovici Adrian
Dec 31 '18 at 13:53
6
Your function,arrayToStringdoes not really have anything to do with your typeNumeric, it's just a function that rendersShowable values in a special way. It can't render values that aren't Showable andNumhas nothing to do with its operation.
– Thomas M. DuBuisson
Dec 31 '18 at 14:04
add a comment |
So basically if my typeAimplementsT1andT2typeclasses , and i only put a constraint forT1inside a method , it can't deduce that it implementsT2too ?
– Bercovici Adrian
Dec 31 '18 at 13:53
6
Your function,arrayToStringdoes not really have anything to do with your typeNumeric, it's just a function that rendersShowable values in a special way. It can't render values that aren't Showable andNumhas nothing to do with its operation.
– Thomas M. DuBuisson
Dec 31 '18 at 14:04
So basically if my type
A implements T1 and T2 typeclasses , and i only put a constraint for T1 inside a method , it can't deduce that it implements T2 too ?– Bercovici Adrian
Dec 31 '18 at 13:53
So basically if my type
A implements T1 and T2 typeclasses , and i only put a constraint for T1 inside a method , it can't deduce that it implements T2 too ?– Bercovici Adrian
Dec 31 '18 at 13:53
6
6
Your function,
arrayToString does not really have anything to do with your type Numeric, it's just a function that renders Showable values in a special way. It can't render values that aren't Showable and Num has nothing to do with its operation.– Thomas M. DuBuisson
Dec 31 '18 at 14:04
Your function,
arrayToString does not really have anything to do with your type Numeric, it's just a function that renders Showable values in a special way. It can't render values that aren't Showable and Num has nothing to do with its operation.– Thomas M. DuBuisson
Dec 31 '18 at 14:04
add a comment |
The problem is that you are not using your custom type.
The given type signature is arrayToString :: forall a. Num a => [a] -> String. You have universally quantified over all possible types a that are members of the Num typeclass. This includes your type but also every other numeric type that exists and ever will exist. This is too bold a statement.
You might want to consider changing the signature to arrayToList :: [Numeric] -> String, using your type directly, instead of relying on parametric polymorphism.
Also, as a side-note, is a singly linked list (or a cons-list), not an array.
EDIT: To translate this issue into logic, what you have done is to say
- There is a set of things called
Numeric
- Elements of
Numericare members of the classesNumandShow
- Therefore, for every possible type ever that is in the
Numclass, I can turn a list of that type into a string
You have drastically increased the scope of the statement so that it includes a whole bunch of types we know nothing about and have no proof that they can be turned into strings.
1
If at the compile time, all known data types which are instances ofNumtype class are also an instance ofShowtype class like in the above case, wouldn't Haskell be able to deduce this information fromNum a =>constraint alone..? What do you mean by every possible type ever..?
– Redu
Dec 31 '18 at 14:27
2
@Redu "...all known data types which are instances of Num type class are also an instance of Show type class..." This is not true in general, for example one could implement a(Num b) => Num (a -> b)instance. Haskell refuses to deduce that allNums areShows, because that may not be true later on.
– AJFarmar
Dec 31 '18 at 15:13
1
@AJFarmar Thanks for the comment. I understand and normally i wouldn't bother much and listen to the error message, just throw aShow ainto the constaints mix. Seeing this question intrigued me a little. I would normally expect GHC to process instances in advance, rendering the possiblity of an unshowableNumtype class type to pop up later. I think like, in the above example it gives the impression of unnecessarily whining while at the same time there must a certain reason while things done this way.
– Redu
Dec 31 '18 at 15:33
2
@Redu And if this is a library that may be imported by somebody else who has defined new instances GHC didn't know about at the time it created the library, what then?
– Daniel Wagner
Dec 31 '18 at 16:33
add a comment |
The problem is that you are not using your custom type.
The given type signature is arrayToString :: forall a. Num a => [a] -> String. You have universally quantified over all possible types a that are members of the Num typeclass. This includes your type but also every other numeric type that exists and ever will exist. This is too bold a statement.
You might want to consider changing the signature to arrayToList :: [Numeric] -> String, using your type directly, instead of relying on parametric polymorphism.
Also, as a side-note, is a singly linked list (or a cons-list), not an array.
EDIT: To translate this issue into logic, what you have done is to say
- There is a set of things called
Numeric
- Elements of
Numericare members of the classesNumandShow
- Therefore, for every possible type ever that is in the
Numclass, I can turn a list of that type into a string
You have drastically increased the scope of the statement so that it includes a whole bunch of types we know nothing about and have no proof that they can be turned into strings.
1
If at the compile time, all known data types which are instances ofNumtype class are also an instance ofShowtype class like in the above case, wouldn't Haskell be able to deduce this information fromNum a =>constraint alone..? What do you mean by every possible type ever..?
– Redu
Dec 31 '18 at 14:27
2
@Redu "...all known data types which are instances of Num type class are also an instance of Show type class..." This is not true in general, for example one could implement a(Num b) => Num (a -> b)instance. Haskell refuses to deduce that allNums areShows, because that may not be true later on.
– AJFarmar
Dec 31 '18 at 15:13
1
@AJFarmar Thanks for the comment. I understand and normally i wouldn't bother much and listen to the error message, just throw aShow ainto the constaints mix. Seeing this question intrigued me a little. I would normally expect GHC to process instances in advance, rendering the possiblity of an unshowableNumtype class type to pop up later. I think like, in the above example it gives the impression of unnecessarily whining while at the same time there must a certain reason while things done this way.
– Redu
Dec 31 '18 at 15:33
2
@Redu And if this is a library that may be imported by somebody else who has defined new instances GHC didn't know about at the time it created the library, what then?
– Daniel Wagner
Dec 31 '18 at 16:33
add a comment |
The problem is that you are not using your custom type.
The given type signature is arrayToString :: forall a. Num a => [a] -> String. You have universally quantified over all possible types a that are members of the Num typeclass. This includes your type but also every other numeric type that exists and ever will exist. This is too bold a statement.
You might want to consider changing the signature to arrayToList :: [Numeric] -> String, using your type directly, instead of relying on parametric polymorphism.
Also, as a side-note, is a singly linked list (or a cons-list), not an array.
EDIT: To translate this issue into logic, what you have done is to say
- There is a set of things called
Numeric
- Elements of
Numericare members of the classesNumandShow
- Therefore, for every possible type ever that is in the
Numclass, I can turn a list of that type into a string
You have drastically increased the scope of the statement so that it includes a whole bunch of types we know nothing about and have no proof that they can be turned into strings.
The problem is that you are not using your custom type.
The given type signature is arrayToString :: forall a. Num a => [a] -> String. You have universally quantified over all possible types a that are members of the Num typeclass. This includes your type but also every other numeric type that exists and ever will exist. This is too bold a statement.
You might want to consider changing the signature to arrayToList :: [Numeric] -> String, using your type directly, instead of relying on parametric polymorphism.
Also, as a side-note, is a singly linked list (or a cons-list), not an array.
EDIT: To translate this issue into logic, what you have done is to say
- There is a set of things called
Numeric
- Elements of
Numericare members of the classesNumandShow
- Therefore, for every possible type ever that is in the
Numclass, I can turn a list of that type into a string
You have drastically increased the scope of the statement so that it includes a whole bunch of types we know nothing about and have no proof that they can be turned into strings.
answered Dec 31 '18 at 14:00
sarasara
2,145722
2,145722
1
If at the compile time, all known data types which are instances ofNumtype class are also an instance ofShowtype class like in the above case, wouldn't Haskell be able to deduce this information fromNum a =>constraint alone..? What do you mean by every possible type ever..?
– Redu
Dec 31 '18 at 14:27
2
@Redu "...all known data types which are instances of Num type class are also an instance of Show type class..." This is not true in general, for example one could implement a(Num b) => Num (a -> b)instance. Haskell refuses to deduce that allNums areShows, because that may not be true later on.
– AJFarmar
Dec 31 '18 at 15:13
1
@AJFarmar Thanks for the comment. I understand and normally i wouldn't bother much and listen to the error message, just throw aShow ainto the constaints mix. Seeing this question intrigued me a little. I would normally expect GHC to process instances in advance, rendering the possiblity of an unshowableNumtype class type to pop up later. I think like, in the above example it gives the impression of unnecessarily whining while at the same time there must a certain reason while things done this way.
– Redu
Dec 31 '18 at 15:33
2
@Redu And if this is a library that may be imported by somebody else who has defined new instances GHC didn't know about at the time it created the library, what then?
– Daniel Wagner
Dec 31 '18 at 16:33
add a comment |
1
If at the compile time, all known data types which are instances ofNumtype class are also an instance ofShowtype class like in the above case, wouldn't Haskell be able to deduce this information fromNum a =>constraint alone..? What do you mean by every possible type ever..?
– Redu
Dec 31 '18 at 14:27
2
@Redu "...all known data types which are instances of Num type class are also an instance of Show type class..." This is not true in general, for example one could implement a(Num b) => Num (a -> b)instance. Haskell refuses to deduce that allNums areShows, because that may not be true later on.
– AJFarmar
Dec 31 '18 at 15:13
1
@AJFarmar Thanks for the comment. I understand and normally i wouldn't bother much and listen to the error message, just throw aShow ainto the constaints mix. Seeing this question intrigued me a little. I would normally expect GHC to process instances in advance, rendering the possiblity of an unshowableNumtype class type to pop up later. I think like, in the above example it gives the impression of unnecessarily whining while at the same time there must a certain reason while things done this way.
– Redu
Dec 31 '18 at 15:33
2
@Redu And if this is a library that may be imported by somebody else who has defined new instances GHC didn't know about at the time it created the library, what then?
– Daniel Wagner
Dec 31 '18 at 16:33
1
1
If at the compile time, all known data types which are instances of
Num type class are also an instance of Show type class like in the above case, wouldn't Haskell be able to deduce this information from Num a => constraint alone..? What do you mean by every possible type ever..?– Redu
Dec 31 '18 at 14:27
If at the compile time, all known data types which are instances of
Num type class are also an instance of Show type class like in the above case, wouldn't Haskell be able to deduce this information from Num a => constraint alone..? What do you mean by every possible type ever..?– Redu
Dec 31 '18 at 14:27
2
2
@Redu "...all known data types which are instances of Num type class are also an instance of Show type class..." This is not true in general, for example one could implement a
(Num b) => Num (a -> b) instance. Haskell refuses to deduce that all Nums are Shows, because that may not be true later on.– AJFarmar
Dec 31 '18 at 15:13
@Redu "...all known data types which are instances of Num type class are also an instance of Show type class..." This is not true in general, for example one could implement a
(Num b) => Num (a -> b) instance. Haskell refuses to deduce that all Nums are Shows, because that may not be true later on.– AJFarmar
Dec 31 '18 at 15:13
1
1
@AJFarmar Thanks for the comment. I understand and normally i wouldn't bother much and listen to the error message, just throw a
Show a into the constaints mix. Seeing this question intrigued me a little. I would normally expect GHC to process instances in advance, rendering the possiblity of an unshowable Num type class type to pop up later. I think like, in the above example it gives the impression of unnecessarily whining while at the same time there must a certain reason while things done this way.– Redu
Dec 31 '18 at 15:33
@AJFarmar Thanks for the comment. I understand and normally i wouldn't bother much and listen to the error message, just throw a
Show a into the constaints mix. Seeing this question intrigued me a little. I would normally expect GHC to process instances in advance, rendering the possiblity of an unshowable Num type class type to pop up later. I think like, in the above example it gives the impression of unnecessarily whining while at the same time there must a certain reason while things done this way.– Redu
Dec 31 '18 at 15:33
2
2
@Redu And if this is a library that may be imported by somebody else who has defined new instances GHC didn't know about at the time it created the library, what then?
– Daniel Wagner
Dec 31 '18 at 16:33
@Redu And if this is a library that may be imported by somebody else who has defined new instances GHC didn't know about at the time it created the library, what then?
– Daniel Wagner
Dec 31 '18 at 16:33
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53988227%2fcan-not-use-show-even-if-type-implements-it%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown