【发布时间】:2012-07-10 01:20:03
【问题描述】:
这应该很简单,但我似乎无法绕过它。
假设我有自己的 List 类,在其接口中声明 head 和 tail。 List 应该是您所期望的,即同质项目的集合。
然后,我想创建一个实现List 接口的data 类型。
以下代码是我想出的,但它不起作用:您将如何修复它?
class List l where
head :: l -> a -- ERROR! How do I tell: given a list, return an element?
tail :: l -> l
data ConsList a = Nil | Cons a (ConsList a)
instance List (ConsList Int) where
head Nil = error "Empty List"
head (Cons h _) = h
tail Nil = error "Empty List"
tail (Cons _ t) = t
提前致谢!
【问题讨论】:
-
只是一个元注释:Haskell 初学者经常声明类有点常见。你可能只想写两个
head :: ConsList a -> a和tail :: ConsList a -> ConsList a类型的函数,而不是一个类。 -
作为一个更通用的“列表类”的示例,请考虑 parsec 的
Stream -
@DanielWagner 我同意你的看法!我只是在阅读 Okasaki 的书,它解释了同一接口的许多实现,但我被这个问题困在第 3 页。