Function OCaml匹配和函数差异的解释
我刚刚开始学习OCaml,我正在玩打印字符串的游戏 我正在运行的ocamlc的剪报是:Function OCaml匹配和函数差异的解释,function,pattern-matching,ocaml,Function,Pattern Matching,Ocaml,我刚刚开始学习OCaml,我正在玩打印字符串的游戏 我正在运行的ocamlc的剪报是: open Printf;; type days = | Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday let string_from_day day = match day with | Monday -> "Monday" | Tuesday -> "Tuesday
open Printf;;
type days =
| Monday
| Tuesday
| Wednesday
| Thursday
| Friday
| Saturday
| Sunday
let string_from_day day = match day with
| Monday -> "Monday"
| Tuesday -> "Tuesday"
| Wednesday -> "Wednesday"
| Thursday -> "Thursday"
| Friday -> "Friday"
| Saturday -> "Saturday"
| Sunday -> "Sunday"
let d = Monday;;
Printf.printf "The day is %s \n" (string_from_day d);;
它运行得很好,只需打印出“今天是星期一”
但它说我可以用function
关键字定义我的函数。因此,我重写了代码,使其看起来像:
open Printf;;
type days =
| Monday
| Tuesday
| Wednesday
| Thursday
| Friday
| Saturday
| Sunday
let string_from_day day = function
| Monday -> "Monday"
| Tuesday -> "Tuesday"
| Wednesday -> "Wednesday"
| Thursday -> "Thursday"
| Friday -> "Friday"
| Saturday -> "Saturday"
| Sunday -> "Sunday"
let d = Monday;;
Printf.printf "The day is %s \n" (string_from_day d);;
但是,这会产生以下错误:
Error: This expression has type days -> string
but an expression was expected of type string
我的问题是为什么?我的理解是,在这两个版本中,string\u from\u day
函数应计算为字符串
当我使用match
关键字将函数输入顶层时,我得到
val string_from_day : days -> bytes = <fun>
我发现两者的顶级结果不同,但curried函数以
字节结束,这不是最重要的吗?现实世界中的OCaml书籍说,这些是等效的,但似乎并非如此。如有任何解释或提供更多信息,将不胜感激 使用关键字function
时,不能在函数声明中写入参数名称,因为不再需要它。这就是你想写的:
let string_of_day = function
| Monday -> ...
仔细检查RWO中给出的示例:
# let some_or_zero = function
| Some x -> x
| None -> 0
;;
val some_or_zero : int option -> int = <fun>
# List.map ~f:some_or_zero [Some 3; None; Some 4];;
- : int list = [3; 0; 4]
严格等同于
let f x = match x with ...
使用关键字function
时,不能在函数声明中写入参数名称,因为它不再需要。这就是你想写的:
let string_of_day = function
| Monday -> ...
仔细检查RWO中给出的示例:
# let some_or_zero = function
| Some x -> x
| None -> 0
;;
val some_or_zero : int option -> int = <fun>
# List.map ~f:some_or_zero [Some 3; None; Some 4];;
- : int list = [3; 0; 4]
严格等同于
let f x = match x with ...
啊,谢谢你!我也在看下一个例子,但我发现这是一个不同的用法。是的,关键字function
替换了上一个参数。您仍然可以在之前添加其他参数,如RWO.:)请注意,function
不是特殊的参数语法或类似的语法,只是定义了一个单参数匿名函数。这是funx->将x与…
匹配的简写。啊,谢谢!我也在看下一个例子,但我发现这是一个不同的用法。是的,关键字function
替换了上一个参数。您仍然可以在之前添加其他参数,如RWO.:)请注意,function
不是特殊的参数语法或类似的语法,只是定义了一个单参数匿名函数。它是funx->将x与…
匹配的简写形式。