ERM:
class Foo s where
myCons :: Char -> s -> s
myCons c xs = <my definition of however I wish to interpret this>
instance (Eq, Show) Foo where
(:) x y = x `myCons` y
Erro:
Pattern bindings (except simple variables) not allowed in instance declaration:
(:) x y = x `myCons` y
O que estou fazendo errado?
O que eu quero fazer:
fooFromList :: [Int] -> Foo
fooFromList [] = Foo []
fooFromList (x:xs) = let x' = (convertDigitToChar x) in x':(fooFromList xs)
Você não pode sobrescrever funções existentes. Haskell usa polimorfismo ad-hoc para isso.
O que você pode fazer no caso de uma lista é trabalhar com a
OverloadedLists
extensão [ghc-doc] .Se você tiver um tipo de dado
Foo
com:Você pode usar:
Se você compilar com
-XOverloadedLists
, poderá usar literais de lista em seu código que serão do tipoFoo a
.Mas isso não sobrecarrega a
(:)
função: se você usar:
, ela ainda usará o(:) :: a -> [a] -> [a]
one.Recomendo simplesmente extrair o
Foo
aplicativo fora da recursão. (Na verdade... um novo tipo é realmente necessário, ou você apenas o criou como um palpite? O que fazFoo
que[Char]
não faz?)O compilador pode escrever essas instâncias para você, e é raro fazer algo diferente do que o derivador faz.