我正在从“Real World Haskell”一书中学习 Haskell。在第 66 和 67 页中,他们用这个例子展示了 case 表达式:
fromMaybe defval wrapped =
case wrapped of
Nothing -> defval
Just value -> value
我记得 F# 中也有类似的东西,但是(如本书前面所述)Haskell 可以将函数定义为一系列方程;而AFAIK,F Sharp不能。所以我试图以这样的方式定义它:
fromMaybe2 defval Nothing = defval
fromMaybe2 defval (Just value) = value
我将它加载到 GHCi 中,经过几个结果后,我确信它是一样的但是;这让我想知道,为什么在等式时应该有 case 表达式:
- 更容易理解(这是数学;为什么要使用
case something of
,谁说的?); - 不那么冗长(2 对 4 行);
- 需要更少的结构化和语法糖(
->
可以是运算符,看看他们做了什么!); - 仅在需要时使用变量(在基本情况下,例如这
wrapped
只是占用空间)。
case 表达式有什么好处?它们的存在仅仅是因为类似的基于 FP 的语言(例如 F#)拥有它们吗?我错过了什么吗?
编辑:
我从@freyrs 的回答中看到编译器使它们完全相同。因此,方程总是可以转换为 case 表达式(如预期的那样)。我的下一个问题是相反的;可以走编译器的相反路线并使用带有let
/where
表达式的方程式来表达任何 case 表达式吗?