Haskell以其安全的语言而闻名.通常会将更多可能的编程错误推送到编译时错误,并减少运行时间.
这方面的一个例子是if表达.在else中,如果始终是强制性的.你需要掩盖两种可能性.这很好,因为您已经考虑并涵盖了运行时将发生的所有可能性.
现在Haskell有一个case表达.(这与switch其他OO和命令式语言中的语句有一些相似之处- 但Haskell在类型系统中增加了很多丰富性).
describeList :: [a]
describeList xs = "The list is " ++ case cs of [] -> "empty."
[x] -> "a singleton list."
xs -> "a longer list."
Run Code Online (Sandbox Code Playgroud)
但是使用case表达式,默认的'catch-all'不是强制性的.
对我来说,这听起来会导致运行时错误.
我的问题是:为什么Haskell case语句中的默认catch-all不是必需的?
Haskell肯定比许多其他语言更安全,特别是主流语言,但它远非100%安全.Haskell中的其他不安全功能包括编写无限循环的能力,如let x = x in x,或unsafePerformIO,或 error,或undefined.我猜你可以说这只是方便和安全之间的权衡.
在比简单示例更复杂的代码中,有时会出现一些您知道不会发生的情况,因此您将它们从case表达式中删除,但Haskell的类型系统不够强大,编译器无法知道那些丢失的案件是不可能的.(例如,你可能会计算一些数学函数只能返回的数字3,4或者5,但事实是由于你碰巧了解和编译器不知道的一些困难的定理.)
对于它的价值,你可以传递-fwarn-incomplete-patterns给ghc编译器,以便在编译时你在case语句中缺少一个分支时得到一个警告,如果你愿意的话.这包含在-W选项中,该选项打开了几个通常需要的编译器警告.
| 归档时间: |
|
| 查看次数: |
406 次 |
| 最近记录: |