Ocaml, понять функцию - PullRequest
       11

Ocaml, понять функцию

1 голос
/ 06 сентября 2011

У меня есть некоторые проблемы с пониманием, как работает эта функция, в частности, я не понимаю, как это происходит с последней строкой. Может кто-нибудь объяснить мне, что он делает, может быть, с псевдокодом?

    let traduit_pair a b =
            let a = traduit mark a in let b = traduit mark b in (a, b) in
    let (teq1, teq2, lneq) =
            let rec f l1 l2 l3 =
            (function
                 | [] -> ((Uplet l1), (Uplet l2), l3)
                 | EqualIF (a, b) :: fin ->
                     let (a, b) = traduit_pair a b
                     in f (a :: l1) (b :: l2) l3 fin
                 | NotEqualIF (a, b) :: fin ->
                         let (a, b) = traduit_pair a b
                     in f l1 l2 ((a, b) :: l3) fin)
            in f [] [] [] (List.rev condlst)

1 Ответ

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

Общий поток вашего кода выглядит так:

Сначала определяется функция traduit_pair.Он принимает два аргумента a и b и возвращает пару, содержащую результат применения traduit mark к каждому из них.

Затем определяются переменные teq1, teq2 и lneqкаждый содержит один элемент тройки, возвращаемый f [] [] [] (List.rev condlst), где f определяется следующим образом:

Прежде всего давайте посмотрим, почему f можно вызывать с четырьмя аргументами, когда его определение только именуеттри аргумента: Как вы, наверное, знаете, ML допускает определения функций карри, и определение let f x y = blabla на самом деле является просто сокращением для let f = fun x => fun y => blabla.

Так что, когда мы говорим о функции, принимающей два аргумента, мы действительно говоримо функции, принимающей один аргумент и возвращающей другую функцию, которая принимает другой аргумент.Аналогично, функция, которая принимает три аргумента и затем возвращает другую функцию, принимающую другой аргумент, аналогична функции, принимающей четыре аргумента.

Ключевое слово function, которое используется в определении f, являетсясинтаксический ярлык для создания функции, принимающей аргумент и сопоставление с образцом.То есть function | p1 -> e1 | p2 -> e2 является сокращением для fun x => case x of | p1 -> e1 | p2 -> e2.Таким образом, let rec f l1 l2 l3 = function | p1 -> e1 | p2 -> e2 совпадает с let rec f l1 l2 l3 = fun l4 => case l4 of | p1 -> e1 | p2 -> e2, что совпадает с let rec f l1 l2 l3 l4 = case l4 of | p1 -> e1 | p2 -> e2, который легко идентифицировать как функцию, принимающую четыре аргумента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...