Sml 为什么要使用这个函数?

Sml 为什么要使用这个函数?,sml,currying,Sml,Currying,据我所知,curried函数应该总是返回一个函数。但是,在下面的代码中,我相信这个函数返回一个列表。但是当我检查类型时,它看起来像一个curry函数 fun zipWith f xs ys = case (xs,ys) of ([],_) => [] | (_,[]) => [] | (x::xs',y::ys') => (f(x,y)) :: zipWith f xs' ys' 类型: val zipWith = fn :

据我所知,curried函数应该总是返回一个函数。但是,在下面的代码中,我相信这个函数返回一个列表。但是当我检查类型时,它看起来像一个curry函数

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.

有人能解释一下这个函数的类型和咖喱是如何工作的吗。感谢您的帮助

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
时。。。等等换句话说,它是咖喱的。

它是咖喱的-您不需要一次传递所有参数,但当所有参数都“到达”时,它会生成一个列表。
如果函数主要不是“函数创建”函数,则通常将所有当前参数写在左侧

fun zipWith f xs 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