gpt4 book ai didi

haskell - 为什么我被迫用小写的第一个字母写(数据构造函数)名称?

转载 作者:行者123 更新时间:2023-12-03 12:56:28 25 4
gpt4 key购买 nike

为什么我被迫写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] Compiling Main ( baby.hs, interpreted )
Failed, modules loaded: none.

ghci> baby.hs:29:1: Not in scope: data constructor `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] Compiling Main ( baby.hs, interpreted )
Ok, modules loaded: Main.



以下是我提到的 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作为模式正在寻找与构造函数匹配的所有表达式 LiOfLi应用于 0 个参数;由于构造函数 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)或变量定义。

关于haskell - 为什么我被迫用小写的第一个字母写(数据构造函数)名称?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11218730/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com