定义非空列表的类型

sit*_*sit 2 recursion haskell types

我正在尝试习惯在Haskell中定义递归类型.作为一个简单的练习,我认为定义非空列表数据类型很容易(并且可能有用).

这是我的尝试:

data NonemptyList a = Singleton a | Cons (Singleton a) (NonemptyList a)
Run Code Online (Sandbox Code Playgroud)

这导致编译错误:

不在范围内:类型构造函数或类`Singleton'
失败,模块加载:无.

以下代码编译但不适合我.我不能完全解释为什么不.

data NonemptyList a = Singleton a | Cons  a (NonemptyList a)
Run Code Online (Sandbox Code Playgroud)

谁能为我澄清一下这个?欢迎任何评论.

谢谢

Dir*_*ple 9

这是因为您Singleton在需要类型构造函数的位置使用(数据构造函数).在这个例子中,SingletonCons是数据构造函数,Nonemptylist是一个类型构造函数.很容易混淆这两个概念,因为定义数据构造函数和具有相同名称的类型构造函数是很常见的,例如data Foo a = Foo a.

在这种情况下,data NonemptyList a = Singleton a | Cons a (NonemptyList a)可能是正确的代码使用.