4

为什么我被迫liOfLi代替写作LiOfLi?请指导。

baby.hs 中的代码

LiOfLi = [ [1,3,4,5,6,8], [ 12, 13, 15, 16, 19, 20], [23, 24, 25, 45, 56] ]

ghci 回复:

ghci> :l baby
[1 of 1] 编译 Main(baby.hs,解释)
失败,加载模块:无。

ghci> baby.hs:29:1:不在范围内:数据构造函数“LiOfLi”

将首字母改为小写时

baby.hs 中的代码

liOfLi = [ [1,3,4,5,6,8], [ 12, 13, 15, 16, 19, 20], [23, 24, 25, 45, 56] ]

ghci 回复:

ghci> :l baby
[1 of 1] 编译 Main(baby.hs,解释)
好的,加载的模块:Main。

以下是我提到的 SO 问题,但我无法理解规则/逻辑并得到(我的)上述问题的答案。

为什么 Haskell 强制数据构造函数的第一个字母大写?

变量名需要小写。与此相关的官方文档位于haskell.org/onlinereport/intro.html#namespaces – (由Chris Kuklewicz发表的 SO 评论)

4

3 回答 3

7

数据构造函数(也包括类型构造函数)必须以大写字母开头。在实际编译的第二个示例中,liOfLi它不是数据构造函数,而是一个变量(以小写字母开头)。

这:

liOfLi = [ [1,3,4,5,6,8], [ 12, 13, 15, 16, 19, 20], [23, 24, 25, 45, 56] ]

声明一个变量liOfLi等于[ [1,3,4,5,6,8], [ 12, 13, 15, 16, 19, 20], [23, 24, 25, 45, 56] ].

另一方面,这是:

LiOfLi = [ [1,3,4,5,6,8], [ 12, 13, 15, 16, 19, 20], [23, 24, 25, 45, 56] ]

是模式与LiOfLi表达式的模式匹配[ [1,3,4,5,6,8], [ 12, 13, 15, 16, 19, 20], [23, 24, 25, 45, 56] ]。作为模式匹配,它相当无用,因为它不包含任何变量,所以即使它有效,它也不会做任何事情。它无法编译LiOfLi,因为模式正在寻找与LiOfLi应用于 0 参数的构造函数匹配的所有表达式;因为在LiOfLi您的程序无法编译的任何地方都没有定义构造函数。

您可以成为 0 参数构造函数的唯一方法LiOfLi是引入一个新类型,如下所示:

data MyNewType = LiOfLi

LiOfLi = [ [1,3,4,5,6,8], [ 12, 13, 15, 16, 19, 20], [23, 24, 25, 45, 56] ]仍然行不通,因为它试图将 pattern LiOfLi(这是 type 值的模式MyNewType)与[ [1,3,4,5,6,8], [ 12, 13, 15, 16, 19, 20], [23, 24, 25, 45, 56] ]value (列表类型的值)相匹配。

基本上,这个方程意味着两个不同的东西,这取决于左边的术语=是被解释为模式还是变量。Haskell 的设计者选择让(对于人类读者和编译器)总是很容易通过首字母的大小写来判断给定标识符是构造函数还是变量,这反过来又允许您判断方程是否是模式绑定或变量定义。

于 2012-06-27T03:14:46.337 回答
2

当你写

liOfLi = [ [1,3,4,5,6,8], [ 12, 13, 15, 16, 19, 20], [23, 24, 25, 45, 56] ]

您定义变量 liOfLi以产生列表列表给出的值。相反,数据构造器用于定义代数数据类型,例如,您可以定义以下数据类型:

data Tree a = Nil | Node a (Tree a) (Tree a) 

在这里,NilandNode都是 type 的数据构造函数Tree a。您可以在 ghci 中查看它们的类型,这将显示:

Node :: a -> Tree a -> Tree a -> Tree a
Nil  :: Tree a
于 2012-06-27T03:11:59.387 回答
1

Haskell 中的“数据构造函数”连接到自定义类型。它给数据一个特定的上下文,它实际上不是数据。类型和数据构造函数必须是大写的。

小写字母表示函数或变量的名称。当您在示例中使用该小写名称时,可以将其替换为右侧的列表。

在这种情况下,数据构造函数是[](实际上是其他东西的简写)。

于 2012-06-27T03:15:59.373 回答