【发布时间】:2013-09-14 06:51:58
【问题描述】:
我正在尝试习惯在 Haskell 中定义递归类型。作为一个简单的练习,我认为定义一个非空列表数据类型会很容易(并且可能很有用)。
这是我的尝试:
data NonemptyList a = Singleton a | Cons (Singleton a) (NonemptyList a)
导致编译错误:
不在范围内:类型构造函数或类 `Singleton'
失败,已加载模块:无。
以下代码可以编译,但不适合我。我不能确切地解释为什么不。
data NonemptyList a = Singleton a | Cons a (NonemptyList a)
谁能帮我澄清一下?欢迎任何cmets。
谢谢
丹
【问题讨论】:
-
在你的例子中,
Singleton是一个数据构造函数——你使用这些来定义值。定义类型时,您使用类型构造函数。这两个是不同的概念,不能混用。我只能说第二个选项(有效的那个)非常好,我不知道你为什么不喜欢它。 -
构造函数的字段是类型,而不是构造函数。注意
Cons的第二个字段是NonemptyList a;NonemptyList a是一种类型。 -
感谢您快速清晰的回复。我想我现在明白我的错误了。在下面的代码中,Singleton 是一个数据构造函数,SingletonType 和 NonemptyListType 是类型构造函数。此代码编译。 data SingletonType a = Singleton a data NonemptyListType a = SingletonType a |缺点 (SingletonType a) (NonemptyListType a)