为什么要使用此功能?

时间:2018-10-21 22:23:11

标签: sml currying

据我了解,咖喱函数应始终返回一个函数。但是,在下面的代码中,我相信此函数返回一个列表。但是当我检查类型时,它看起来像是一个咖喱函数。

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。任何帮助表示赞赏!

2 个答案:

答案 0 :(得分:6)

fun f arg1 ... argN = expval 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