Насколько я понимаю, эта функция делает то же самое, чем это один
Вы правильны в том, что два фрагмента кода, оцениваются одинаково.
Может кто-то пожалуйста, помогите мне понять синтаксис первой функции
Как кажется @JeffreyScofield получить ответы эту часть очень хорошо, я остановлюсь на второй части.
если разница в терминах того, как обе функции вычисляются
ПЯ; др там нет никакой разницы, и сборка производится на самом деле идентичны. Мы будем использовать простой пример Фибоначчи, чтобы показать сборку, испущенную с использованием нот match with
и function
.
let rec fib n = match n with
| 0 -> 0
| 1 -> 1
| i -> fib (i - 1) + fib (i - 2)
и
let rec fib = function
| 0 -> 0
| 1 -> 1
| i -> fib (i - 1) + fib (i - 2)
оба производят
fib:
subq $24, %rsp
.L102:
cmpq $1, %rax
je .L100
cmpq $3, %rax
je .L101
movq %rax, 0(%rsp)
addq $-4, %rax
call fib
.L103:
movq %rax, 8(%rsp)
movq 0(%rsp), %rax
addq $-2, %rax
call fib
.L104:
movq 8(%rsp), %rbx
addq %rbx, %rax
decq %rax
addq $24, %rsp
ret
.L101:
movq $3, %rax
addq $24, %rsp
ret
.L100:
movq $1, %rax
addq $24, %rsp
ret
Примечание: Я намеренно удалены .align
S и тому подобное.
Чтобы проверить утверждение, что они производят один и тот же узел (и, таким образом, оценивается то же самое), вы можете просто поместить каждую функцию в файле, а затем запустить
$ ocamlopt -S fib-with-match.ml
$ ocamlopt -S fib-with-function.ml
когда вы diff
два, вы должны увидеть его вернуть без разницы:
$ diff fib-with-match.s fib-with-function.s
$
это очень часто имеют функции, которые содержат только match
выражения в OCaml, так как сказал @JeffreyScofield, function
имеет аргумент, который может быть использован для картины ма собный. Таким образом, это синтаксический сахар.
Источник:
Да, немного запутанный, у нас есть 3 синтаксиса определения функций и сопоставление шаблонов на стороне привязки параметра - да, вы можете сопоставить соответствие слева от знака равенства. –
Колин Г.Д. Есть русский на английском языке. Введение в функциональное программирование в OCaml (www.france-universite-numerique-mooc.fr). Он все еще открыт. Он начал эту неделю (с введением Ксавьера Лероя). –
Hi @ V.Michel Я знаю об этом mooc, мои учителя - это те, кто стоит за ним, но спасибо вам в любом случае. –