Dado:¿Por qué no puedo hacer que String sea una instancia de una clase de tipo?
data Foo =
FooString String
…
class Fooable a where --(is this a good way to name this?)
toFoo :: a -> Foo
Quiero hacer String
una instancia de Fooable
:
instance Fooable String where
toFoo = FooString
GHC continuación, se queja:
Illegal instance declaration for `Fooable String'
(All instance types must be of the form (T t1 ... tn)
where T is not a synonym.
Use -XTypeSynonymInstances if you want to disable this.)
In the instance declaration for `Fooable String'
Si en vez utilizo [Char]
:
instance Fooable [Char] where
toFoo = FooString
GHC se queja:
Illegal instance declaration for `Fooable [Char]'
(All instance types must be of the form (T a1 ... an)
where a1 ... an are type *variables*,
and each type variable appears at most once in the instance head.
Use -XFlexibleInstances if you want to disable this.)
In the instance declaration for `Fooable [Char]'
Pregunta:
- ¿Por qué no puedo realizar cuerda y una instancia de clase de tipos?
- GHC parece dispuesto a dejarme salir con esto si agrego una bandera extra. ¿Es esta una buena idea?
Este es el tipo de preguntas que upvote y marcar como favorito porque de lo contrario Sé que en una futuro lo estaría preguntando;) –
En cuanto a la bandera adicional: es probable que sea una buena idea, siempre y cuando confíes en GHC y entiendas lo que hace la bandera. [Yesod] (http://www.yesodweb.com/) me viene a la mente: lo alienta a usar siempre el pragma OverloadedStrings cuando escribe aplicaciones Yesod, y QuasiQuotes es una necesidad para las reglas de enrutamiento de Yesod. Tenga en cuenta que en lugar de un indicador en tiempo de compilación, también puede poner '{- # LANGUAGE FlexibleInstances # -}' (o cualquier otro pragma) en la parte superior de su archivo .hs. –