当我第一次在OCaml中使用function
关键字时,我得到的印象是消除模式匹配的match x with
行是语法糖。
但是,我看到两者之间存在签名差异,如下例所示。在什么情况下,您希望使用function
示例?
type e = Foo | Bar
let eval1 exp =
match exp with
| Foo -> "Foo"
| Bar -> "Bar"
let eval2 exp = function
| Foo -> "Foo"
| Bar -> "Bar"
第一个函数的签名为val eval1 : e -> bytes = <fun>
第二个函数的签名为val eval2 : 'a -> e -> bytes = <fun>
答案 0 :(得分:6)
在eval2
中,使用function
时,匹配的参数是隐式的。 exp
此处未使用,应向您发出编译器警告(除非您已将其关闭)。如果删除exp
参数,则签名应该相同。
或者换句话说,function ...
不仅仅是match exp with ...
的语法糖,而是fun exp -> match exp with ...
的语法糖