2

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

这是我的尝试:

data NonemptyList a = Singleton a | Cons (Singleton a) (NonemptyList a)

这导致编译错误:

不在范围内:类型构造函数或类“单例”
失败,已加载模块:无。

以下代码可以编译,但不适合我。我不能确切地解释为什么不。

data NonemptyList a = Singleton a | Cons  a (NonemptyList a)

任何人都可以为我澄清这一点吗?欢迎任何意见。

谢谢

4

2 回答 2

9

这是因为您Singleton在需要类型构造函数的地方使用了(数据构造函数)。在此示例中,SingletonandCons是数据构造函数,并且Nonemptylist是类型构造函数。这两个概念很容易混淆,因为定义一个数据构造函数和一个类型构造函数同名是很常见的,例如data Foo a = Foo a

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

于 2013-09-13T21:46:30.890 回答
4

作为旁注,定义非空列表的更简单方法是:

data NonEmpty a = NonEmpty { head :: a, tail :: [a] }

最流行的非空列表包是包,它与Data.List.NonEmpty模块semigroups中的上述定义类似。

于 2013-09-13T22:51:58.540 回答