【发布时间】:2012-03-15 23:13:37
【问题描述】:
在 Haskell 或 F# 等函数式语言中使用非穷举模式处理通常被认为是一种不好的做法,这意味着指定的案例并未涵盖所有可能的输入案例?
特别是,我应该允许代码因MatchFailureException 等而失败,还是应该始终涵盖所有情况并在必要时明确抛出错误?
例子:
let head (x::xs) = x
或者
let head list =
match list with
| x::xs -> x
| _ -> failwith "Applying head to an empty list"
F#(与 Haskell 不同)对第一个代码给出警告,因为 []-case 没有被覆盖,但是为了简洁起见,我可以在不破坏功能样式约定的情况下忽略它吗?毕竟,MatchFailure 确实很好地说明了问题......
【问题讨论】:
-
+1,尽管我非常喜欢函数式编程,但我确信我们需要避免函数式编程特有的代码气味。
-
GHC 有 -fwarn-incomplete-patterns 如果你愿意的话。
-
请注意,这与函数式编程无关,而是特定于从 ML 家族派生的语言中提供的模式匹配样式。许多函数式语言无法检测模式匹配的穷举性(例如 Mathematica)。
标签: haskell f# functional-programming