“无操作”haskell

Posted

技术标签:

【中文标题】“无操作”haskell【英文标题】:"No operation" haskell 【发布时间】:2013-05-17 13:23:45 【问题描述】:

如果我在学校没记错的话,有一个函数或关键字用于“尚未实现”,但代码可以编译。我试图搜索它,但找不到。有人知道我在找什么吗?

有点像

isDivisor :: Integer -> Integer -> Bool
isDivisor x y = None
--isDivisor x y = (rem x y) == 0

【问题讨论】:

使用undefined。当你调用该函数时,你会得到***Exception: Prelude.undefined 或者,isDivisor x y = error "Not yet implemented",或者,如果你想让 ghci 循环,isDivisor x y = isDivisor x y 【参考方案1】:

你想到的叫bottom

bottom 不仅仅用于显示未实现的内容,它还用于表示导致我们的程序失败的计算。

例如我们实际上可以将undefined自己定义为一个无限循环

undefined = let x = x in x
undefined = undefined

所以实际上我们所做的只是输入一个值undefined :: a,这将导致或程序永远崩溃或循环,但从不评估它。

因此,如果您有一些不知道如何实现的大而复杂的功能,您可以这样做

foo :: Bar -> Baz -> Quux
foo bar baz = foo bar baz

因为这个类型检查,它会编译,我们可以测试我们程序的其他部分。

但是,由于在您不小心运行程序的那部分时出现无限循环是非常无益的,因此 GHC 和其他人以不同的方式实现 undefined。他们让程序崩溃并发出错误消息,例如:

-- In GHC
error msg = throw (ErrorCall s)
undefined = error "Prelude.undefined"

所以要保留一个具有更好调试功能的未定义函数

foo bar baz = undefined
foo bar baz = error ("Tried to evaluate foo with" ++ show bar ++ show baz)

如果您发现底部的概念令人困惑,hammar 发布了一个很棒的 answer

【讨论】:

以上是关于“无操作”haskell的主要内容,如果未能解决你的问题,请参考以下文章

为啥这个无操作循环没有被优化掉?

threejs1实现创建个无材质的球(无操作)

“无操作”haskell

secureCRT无操作自动登出时间修改(亲测可用)

在 C++ 中实现无操作语句的可移植方式是啥?

WPF:鼠标长时间无操作,窗口隐藏