为什么我被迫写 liOfLi
代替 LiOfLi
?请指导。
baby.hs 中的代码
ghci 回复:
将首字母更改为小写时
baby.hs 中的代码
ghci 回复:
以下是我提到的 SO 问题,但我未能理解规则/逻辑并获得(我的)上述问题的答案。
Why does Haskell force data constructor's first letter to be upper case?
变量名需要小写。与此相关的官方文档位于 haskell.org/onlinereport/intro.html#namespaces –(SO 评论)Chris Kuklewicz
最佳答案
数据构造器(也包括类型构造器)必须以大写字母开头。在实际编译的第二个示例中, 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
,因为模式正在寻找与应用于 0 个参数的构造函数 LiOfLi
匹配的所有表达式;因为在您的程序无法编译的任何地方都没有定义构造函数 LiOfLi
。使
LiOfLi
成为 0 参数构造函数的唯一方法是引入一个新类型,如下所示:data MyNewType = LiOfLi
但是
LiOfLi = [ [1,3,4,5,6,8], [ 12, 13, 15, 16, 19, 20], [23, 24, 25, 45, 56] ]
仍然无法工作,因为它试图将模式 LiOfLi
(这是 MyNewType
类型的值的模式)与值 [ [1,3,4,5,6,8], [ 12, 13, 15, 16, 19, 20], [23, 24, 25, 45, 56] ]
进行匹配,该值是列表类型的值。基本上,该方程意味着两个不同的东西,这取决于
=
左侧的术语是被解释为模式还是变量。 Haskell 的设计者选择让(对于人类读者和编译器)总是很容易通过它的第一个字母的大小写来判断给定的标识符是构造函数还是变量,这反过来又允许你判断一个方程是否是模式绑定(bind)或变量定义。