我正在尝试习惯在Haskell中定义递归类型。作为一个简单的练习,我认为定义非空列表数据类型很容易(并且可能有用)。
这是我的尝试:
data NonemptyList a = Singleton a | Cons (Singleton a) (NonemptyList a)
导致编译错误:
不在范围内:类型构造函数或类`Singleton'
失败,模块加载:无。
以下代码编译但不适合我。我不能完全解释为什么不。
data NonemptyList a = Singleton a | Cons a (NonemptyList a)
有人可以为我澄清这个吗?欢迎任何评论。
由于
丹
答案 0 :(得分:9)
这是因为您在需要类型构造函数的位置使用了Singleton
(数据构造函数)。在此示例中,Singleton
和Cons
是数据构造函数,Nonemptylist
是类型构造函数。很容易混淆这两个概念,因为定义一个具有相同名称的数据构造函数和类型构造函数是很常见的,例如: data Foo a = Foo a
。
在这种情况下,data NonemptyList a = Singleton a | Cons a (NonemptyList a)
可能是正确的代码。
答案 1 :(得分:4)
作为旁注,定义非空列表的更简单方法是:
data NonEmpty a = NonEmpty { head :: a, tail :: [a] }
非空列表最受欢迎的包是semigroups
包,它与Data.List.NonEmpty模块中的上述定义类似。