Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
'的作用是什么;底部';Haskell函数定义中的(⊥;)?_Haskell - Fatal编程技术网

'的作用是什么;底部';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代码3中
zip[]124; u=[]
是属性的文档,该属性是
zip
定义的结果,而不是其定义的一部分

作为对该属性的描述,
zip[].=[]
是一个不太具体的声明;这意味着,无论您在上调用
zip[]
,它都会返回
[]
。它的意义完全相同,因为唯一的方法是
zip[]⊥可以返回非底部的内容。但它并没有直接提到非严格性的定义

作为构成函数定义一部分的代码,
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