2011-09-11 25 views
9

在SML中,使用柯里化和模式匹配来定义函数是很常见和容易的。这里有一个简单的例子:在OCaml中混合模式匹配和柯里化

fun zip [] _ = [] 
    | zip _ [] = [] 
    | zip (x::xs) (y::ys) = (x,y)::(zip xs ys) 

忽略库函数,什么是端口的最佳方式来OCaml的?据我所知,没有简单的方法来使用currying和模式匹配来声明一个函数。

回答

11

我会说最好只使用一个匹配表达式。

let rec zip xs ys = 
    match xs, ys with 
    | [], _ 
    | _, [] -> [] 
    | x :: xs, y :: ys -> (x, y) :: zip xs ys 

如果你不使用匹配,它有点复杂,但你可以做到这一点。

let rec zip = function 
    | [] -> (fun _ -> []) 
    | x :: xs -> 
     function 
     | [] -> [] 
     | y :: ys -> (x, y) :: zip xs ys