Teniendo en cuenta la clase de tipoTipo referente a "FlexibleInstances"
class Dictionary w where
insert :: String -> String -> w -> w
remove :: String -> w -> w
lookUp :: String -> w -> String
no puedo escribir
instance Dictionary [(String,String)] where
insert key value dic = (key,value) : remove key dic
remove key dic = filter (\entry -> (fst entry) /= key) dic
lookUp key [] = "not found"
lookUp key ((k,v):xs) | k == key = v
| otherwise = lookUp key xs
debido
Illegal instance declaration for `Dictionary[(String, String)]'
(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 `Dictionary[(String, String)]'
... que no lo hago entiendo muy bien. Algo como esto funciona:
newtype Dic = Dic [(String,String)]
instance Dictionary Dic where
insert key value (Dic dic) = Dic $ (key,value) : filter (\entry -> (fst entry) /= key) dic
remove key (Dic dic) = Dic $ filter (\entry -> (fst entry) /= key) dic
lookUp key (Dic []) = "not found"
lookUp key (Dic ((k,v):xs)) | k == key = v
| otherwise = lookUp key (Dic xs)
¿Hay una manera mejor? ¿O debería usar la directiva del compilador sugerida?
Claro, pero mi pregunta era más de por qué me sale este error en absoluto, y si hay una manera menos feo para crear instancias de mi clase de tipo estándar en Haskell. – Landei