Смешивание шаблонов и карри в OCaml - PullRequest
9 голосов
/ 11 сентября 2011

В SML обычно и легко определить функцию, используя как каррирование, так и сопоставление с образцом.Вот простой пример:

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

Игнорирование библиотечных функций, как лучше всего перенести это на OCaml?Насколько я могу судить, не существует простого способа объявить функцию с использованием как каррирования, так и сопоставления с образцом.

1 Ответ

11 голосов
/ 11 сентября 2011

Я бы сказал, что лучше всего использовать выражение соответствия.

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...