如果我从学校正确记得,有一个函数或关键字用于“尚未实现”,但代码编译。我试图搜索它,但找不到。谁知道我在找什么?
就像是
isDivisor :: Integer -> Integer -> Bool
isDivisor x y = None
--isDivisor x y = (rem x y) == 0
答案 0 :(得分:8)
您所考虑的内容称为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)
如果你发现底层混乱的概念,哈马尔发布了一个很棒的answer