根据我的理解,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的工作原理.任何帮助表示赞赏!
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,......等等.换句话说,它是咖喱.