参数采用OCaml中的curried函数的顺序
通常,我们编写这样的函数参数采用OCaml中的curried函数的顺序,ocaml,Ocaml,通常,我们编写这样的函数 let abs_diff x y = abs (x-y) 我们还可以有一个咖喱版: let abs_diff = fun x -> fun y -> abs(x-y) 我写这个问题只是想确认我对咖喱的理解是正确的 以下是我的理解: 让abs_diff=fun x->fun y->abs(x-y)实际返回一个带有一个参数的函数,该参数是fun y->abs(x-y),其中x是参数 因此,当我们应用abs_diff 5 6时,它首先获取第一个参数5,返回一
let abs_diff x y = abs (x-y)
我们还可以有一个咖喱版
:
let abs_diff = fun x -> fun y -> abs(x-y)
我写这个问题只是想确认我对咖喱的理解是正确的 以下是我的理解:
让abs_diff=fun x->fun y->abs(x-y)
实际返回一个带有一个参数的函数,该参数是fun y->abs(x-y)
,其中x是参数abs_diff 5 6
时,它首先获取第一个参数5
,返回一个函数funy->abs(5-y)
,然后继续应用到参数6
,因此最终结果是(funy->abs(5-y))6
此外,为了处理函数应用程序,OCaml解释器是否与utop类似,OCaml是否与上面的第2点类似?首先,两种编写方法
let abs_diff x y = abs (x-y)
let abs_diff = fun x -> fun y -> abs(x-y)
它们是等价的。它们都定义了类型相同的函数
val abs_diff : int -> int -> int = <fun>
这当然相当于
fun y -> abs (5-y)
请注意,如果这是您需要的,编译器可以将所有这些函数操作优化为一个简单的函数调用。首先,两个
let abs_diff x y = abs (x-y)
let abs_diff = fun x -> fun y -> abs(x-y)
它们是等价的。它们都定义了类型相同的函数
val abs_diff : int -> int -> int = <fun>
这当然相当于
fun y -> abs (5-y)
请注意,如果您需要的话,编译器可以将所有这些函数操作优化为一个简单的函数调用。让我补充一下:
OCaml中的函数始终是curry。这对初学者来说可能很奇怪。混淆可能是:我什么时候分配函数,什么时候分配函数结果
# let sayhello = print_endline "hello!";;
hello!
val sayhello : unit = ()
# let hello () = print_endline "hello!";;
val hello : unit -> unit = <fun>
# let h = hello;;
val h : unit -> unit = <fun>
# h ();;
hello!
- : unit = ()
这些定义产生相同的函数。您可以对多个参数使用fun
,但不能使用函数
希望这有帮助。让我补充一下:
OCaml中的函数始终是curry。这对初学者来说可能很奇怪。混淆可能是:我什么时候分配函数,什么时候分配函数结果
# let sayhello = print_endline "hello!";;
hello!
val sayhello : unit = ()
# let hello () = print_endline "hello!";;
val hello : unit -> unit = <fun>
# let h = hello;;
val h : unit -> unit = <fun>
# h ();;
hello!
- : unit = ()
这些定义产生相同的函数。您可以对多个参数使用fun
,但不能使用函数
希望这能有所帮助。通常的做法是函数
'a->'b->'c
是curry,而函数'a*'b->'c
不是curry。两者都可以在OCaml中定义。因为'a*'b
是一对的类型,通常写入(a,b),而一对是一个参数。“我想我已经知道了。”@Str:这没有道理。Curried和Uncarried是概念上的区别,而不是语义上的区别。这正是程序员在概念上需要多个参数时的区别,是选择编写一个接受一个参数的函数并返回一个接受其余参数的函数,还是将所有参数放在一起。您可以用任何语言编写curried或uncarried形式的多参数函数。@newacct您指的是我的答案还是我的评论?@Str:两者都有。主要是JeffreyScofield回应的“OCaml中的函数总是被咖喱化”的断言。通常的看法是函数'a->'b->'c
是咖喱化的,而函数'a*'b->'c
不是咖喱化的。两者都可以在OCaml中定义。因为'a*'b
是一对的类型,通常写入(a,b),而一对是一个参数。“我想我已经知道了。”@Str:这没有道理。Curried和Uncarried是概念上的区别,而不是语义上的区别。这正是程序员在概念上需要多个参数时的区别,是选择编写一个接受一个参数的函数并返回一个接受其余参数的函数,还是将所有参数放在一起。您可以用任何语言编写curried或uncarried形式的多参数函数。@newacct您指的是我的答案还是我的评论?@Str:两者都有。主要是JeffreyScofield回应的“OCaml中的函数总是被咖喱化”的断言。