为什么我被迫写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/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/1]编译Main(baby.hs,解释)
好的,模块加载:Main.
以下是我提到的SO问题,但我没有理解规则/逻辑,并得到(我)上述问题的答案.
变量名称必须小写.与此相关的官方文档位于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] ]
Run Code Online (Sandbox Code Playgroud)
声明变量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] ]
Run Code Online (Sandbox Code Playgroud)
是模式与LiOfLi表达式的模式匹配[ [1,3,4,5,6,8], [ 12, 13, 15, 16, 19, 20], [23, 24, 25, 45, 56] ].作为模式匹配它是相当无用的,因为它不包含任何变量,所以即使它工作也不会做任何事情.它无法编译,LiOfLi因为模式正在查找与LiOfLi应用于0参数的构造函数匹配的所有表达式; 因为LiOfLi没有在任何地方定义构造函数,所以无法编译程序.
你可以成为LiOfLi0参数构造函数的唯一方法是引入一个新类型,如下所示:
data MyNewType = LiOfLi
Run Code Online (Sandbox Code Playgroud)
但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的设计者选择让它(对于人类读者和编译器)总是容易告诉给定的标识符是构造函数还是变量的第一个字母的情况,这反过来允许你判断方程是否是模式绑定或变量定义.