为什么这个功能是咖喱的?

yes*_*sar 0 sml currying

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

fun zipWith f xs ys =
    case (xs,ys) of
         ([],_) => []
      | (_,[]) => []
      | (x::xs',y::ys') => (f(x,y)) :: zipWith f xs' ys'
Run Code Online (Sandbox Code Playgroud)

类型:

val zipWith = fn : ('a * 'b -> 'c) -> 'a list -> 'b list -> 'c list.
Run Code Online (Sandbox Code Playgroud)

有人可以解释这个函数中的类型和currying的工作原理.任何帮助表示赞赏!

sep*_*p2k 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
    ...
Run Code Online (Sandbox Code Playgroud)

zipWith是一个函数,当给定一个参数时f,返回另一个函数,当给出一个参数时xs,......等等.换句话说,它是咖喱.