口粮:
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
错误:
Pattern bindings (except simple variables) not allowed in instance declaration:
(:) x y = x `myCons` y
我做错什么了?
我想要做的事情:
fooFromList :: [Int] -> Foo
fooFromList [] = Foo []
fooFromList (x:xs) = let x' = (convertDigitToChar x) in x':(fooFromList xs)
您无法覆盖现有函数。Haskell 使用临时多态性来实现这一点。
但是,在列表的情况下,您可以使用
OverloadedLists
扩展名 [ghc-doc]。如果你有一个数据类型
Foo
:您可以使用:
如果您使用 进行编译
-XOverloadedLists
,则可以在代码中使用类型为 的列表文字Foo a
。但这不会使函数超载
(:)
:如果您使用:
,它仍将使用那个(:) :: a -> [a] -> [a]
。我建议简单地将
Foo
应用程序提取到递归之外。(事实上……真的需要一种新类型吗,还是你只是猜测?什么能做Foo
而什么[Char]
不能做?)编译器可以为您编写这些实例,并且很少执行与导出程序不同的事情。