'的作用是什么;底部';Haskell函数定义中的(⊥;)?
我不明白('的作用是什么;底部';Haskell函数定义中的(⊥;)?,haskell,Haskell,我不明白(⊥或124;) 例如,的定义将其描述为“右懒惰”,因为 但我不清楚这和 zip [] _ = [] \u124;在上述函数定义中扮演什么角色?特别是,它与使用有何不同 更新和注意:正如优秀答案的读者将自己发现的那样,这些答案的一个关键部分,值得在此引述,就是⊥不()出现在Haskell函数定义中 Bottom本质上是一种奇特的代数方式,表示未定义 如果您尝试这样做,您可以看到为什么zip的右参数是懒惰的: λ> zip [] undefined [] λ> zip un
⊥或124;
)
例如,的定义将其描述为“右懒惰”,因为
但我不清楚这和
zip [] _ = []
\u124;
在上述函数定义中扮演什么角色?特别是,它与使用
有何不同
更新和注意:正如优秀答案的读者将自己发现的那样,这些答案的一个关键部分,值得在此引述,就是⊥事实上,代码>不()出现在Haskell函数定义中 Bottom本质上是一种奇特的代数方式,表示未定义
如果您尝试这样做,您可以看到为什么zip
的右参数是懒惰的:
λ> zip [] undefined
[]
λ> zip undefined []
*** Exception: Prelude.undefined
这是因为undefined
仅在尝试对其求值时失败
由于它的呈现方式,您可能会将124;
与
混淆。我要说明的是:zip[]124; u=[]
这一行并不是模式匹配,而是一个等式,说明了zip[]124;
和[]
的相等性。也就是说,这不是有效的Haskell代码,而是一种表示“我不关心第二个参数”的符号化、抽象代数方式
在zip
的定义中,您当然可以使用。
,但这与此无关。您可以使用任何名称,只要它不是构造函数匹配模式,例如(仅x)
或(a,b)
。值将保持未计算状态,直到它们必须在纯代码中进行模式匹配
您可以阅读有关惰性评估的更多信息
你可以阅读更多关于底部和底部的信息。在AJFarmar的回答中,我认为这个关键点没有明确指出:
124;
在Haskell代码中不是有效的文字或标识符李>
- 因此,
zip[]124;=[]
也不是有效的代码李>
这是AJFarmar这句话的含蓄意思:
[T] 行zip[].\u124;
不是模式匹配,而是一个等式,说明zip[].\u124;
和[]
的相等性
为了清楚起见,zip[]124;=[]
出现在文档注释中,以了解zip
的定义。这不是Haskell代码,而是用非正式的技术符号编写的英语注释,看起来有点像Haskell代码。或者,换句话说,是伪代码。我想OP已经意识到了这一点,但为了其他带着同样困惑来到这里的人的利益:zip[].\u124;.[]
不是实际的代码
符号124;
(这只是数学符号的ascii艺术表现)⊥代码>)表示底部1,但仅当我们谈论Haskell时。在Haskell代码中,它没有这样的含义2
行zip[]124; u=[]
是对zip
的实际代码属性的描述;如果您使用第一个参数[]
调用它,并将任何底部值作为第二个参数传递,则结果等于[]
。他们想确切地说这是因为函数f
非严格的技术定义是当f⊥代码>不是⊥代码>
但是没有|
(或⊥在定义Haskell函数(在代码中)时,使用code>或未定义的
,或底部的概念)。必须无法对参数进行模式匹配,才能查看它是否为⊥代码>,原因有很多,因此,⊥代码>在Haskell代码3中zip[]124; u=[]
是属性的文档,该属性是zip
定义的结果,而不是其定义的一部分
作为对该属性的描述,zip[].=[]
是一个不太具体的声明;这意味着,无论您在上调用zip[]
,它都会返回[]
。它的意义完全相同,因为唯一的方法是zip[]⊥如果它根本不检查第二个参数,那么code>可以返回非底部的内容。但它并没有直接提到非严格性的定义
作为构成函数定义一部分的代码,zip[].[]
不能与zip[].[u124;.[]
进行比较和对比。它们不是备选方案,第一个是有效代码,第二个不是
1是表达式的“值”,该表达式将永远运行、引发异常或以其他方式计算为正常值
2它甚至不是一个有效的Haskell标识符,因为它同时包含“namey”字符(
)和“operator”字符(|
)。所以在Haskell代码中,它实际上不可能是一个有任何意义的符号
3未定义的通常用于⊥代码>,但它更多的是指⊥代码>值大于实际事物本身。就像你有让xs=[1,2,3]
一样,你可以使用xs
来引用列表[1,2,3]
,但是你不能将它作为一种模式来匹配其他列表;尝试的模式匹配只会被视为引入了一个名为undefined
或xs
的新变量,并将旧变量隐藏起来。⊥ 来自数学顺序理论。偏序集合有一个底部元素,表示为⊥, 如果该元素先于其他元素。这是如何进入Haskell文档的?在某种程度上,计算机科学家意识到,思考计算机程序在任何语言中的“含义”都是有用的。一种方法叫做指称语义学。在指称语义学中,编程语言中的每个术语
λ> zip [] undefined
[]
λ> zip undefined []
*** Exception: Prelude.undefined
oops :: Integer
oops = oops
undefined
undefined : undefined
3 : undefined
[undefined]
let foo = undefined : 3 : undefined : foo