两者都是类型是所有类型(无人居住)的交集的术语.两者都可以在代码中传递而不会失败,直到有人试图评估它们.我能看到的唯一区别是,在Java中,存在一个漏洞,它允许仅对null一个操作进行评估,这是一个引用相等比较(==) - 而在Haskell undefined中根本不能在不抛出异常的情况下进行评估.这是唯一的区别吗?
我真正想要解决的问题是,为什么null在Java 中包含这样一个显然很糟糕的决定,以及Haskell如何逃脱它?在我看来,真正的问题是,你可以做一些有用的带null,即你可以检查它的NULL的含量.因为您可以这样做,所以在代码中传递空值并使它们表示"无结果"而不是"此程序中存在逻辑错误"已成为标准惯例.而在Haskell中,没有办法检查一个术语是否在没有评估它且程序爆炸的情况下评估到底部,因此它永远不会用这种方式来表示"没有结果".相反,一个人被迫使用类似的东西Maybe.
对不起,如果看起来我用"评价"这个词快速而宽松地玩......我试图在这里进行类比,并且难以准确地说出它.我想这表明这个比喻是不精确的.
我不理解bottom(?或_|_)在Haskell函数定义中所起的作用.
zip例如,定义将其描述为"正确的懒惰",因为
zip [] _|_ = []
Run Code Online (Sandbox Code Playgroud)
但我不清楚这有何不同
zip [] _ = []
Run Code Online (Sandbox Code Playgroud)
_|_在上面的函数定义中扮演什么角色?特别是,它与使用_有何不同?
更新和注意:作为优秀答案的读者将自己发现,这些答案的一个关键部分,值得提拔,实际上,? 它不会(也不能)出现在Haskell函数定义中.继续阅读.
如果我从学校正确记得,有一个函数或关键字用于"尚未实现",但代码编译.我试图搜索它,但找不到.谁知道我在找什么?
就是这样的
isDivisor :: Integer -> Integer -> Bool
isDivisor x y = None
--isDivisor x y = (rem x y) == 0
Run Code Online (Sandbox Code Playgroud) 我最近注意到我经常编写函数,这些函数只是迭代另一个函数,f直到它到达一个固定点(这样f x == x)
我认为这是一个非常笼统的概念,所以我认为可能有一个内置的。
所以我想知道是否有一个内置的,或者更一般的东西?
所以我基本上是在寻找这个:
fixedpoint f x= head . dropWhile(\y->y /= f y) $ iterate f x
Run Code Online (Sandbox Code Playgroud)
我只是在谷歌搜索时遇到了麻烦,因为我只fix在我的搜索词包含fixed point或类似的东西时才找到对该函数的引用。