Общий поток вашего кода выглядит так:
Сначала определяется функция 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
, который легко идентифицировать как функцию, принимающую четыре аргумента.