Function OCaml匹配和函数差异的解释

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

我刚刚开始学习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"
  | 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与…
匹配的简写形式。