据我了解,咖喱函数应始终返回一个函数。但是,在下面的代码中,我相信此函数返回一个列表。但是当我检查类型时,它看起来像是一个咖喱函数。
fun zipWith f xs ys =
case (xs,ys) of
([],_) => []
| (_,[]) => []
| (x::xs',y::ys') => (f(x,y)) :: zipWith f xs' ys'
类型:
val zipWith = fn : ('a * 'b -> 'c) -> 'a list -> 'b list -> 'c list.
有人可以解释此函数的类型以及如何进行currying。任何帮助表示赞赏!
答案 0 :(得分:6)
fun f arg1 ... argN = exp
是val rec f = fn arg1 => ... => fn argN => exp
的语法快捷方式。因此,在您的情况下,我们有:
val rec zipWith = fn f => fn xs => fn ys =>
case (xs, ys) of
...
因此zipWith
是一个函数,当给定参数f
时,它返回另一个函数,当给定参数xs
时,...依此类推。换句话说,它是咖喱。
答案 1 :(得分:1)
它很咖喱-您不需要一次传递所有参数,但是当所有参数都“到达”时它会产生一个列表。
如果该函数不是主要的“创建函数”功能,通常会在左侧写所有咖喱参数。
如果您以(等效)形式编写定义,则该定义看起来更像类型
fun zipWith f = fn xs =>
fn ys =>
case (xs,ys) of
([],_) => []
| (_,[]) => []
| (x::xs',y::ys') => (f(x,y)) :: ((zipWith f) xs') ys'
“咖喱度”示例:
- val add = zipWith (op +);
val add = fn : int list -> int list -> int list
- val add_123 = add [1,2,3];
val add_123 = fn : int list -> int list
- add_123 [4,5,6];
val it = [5,7,9] : int list