據我理解這個功能確實比這個
你是在正確的兩段代碼進行評估一樣一樣的。
可能有人請幫助我理解第一功能
的語法@JeffreyScofield似乎已經非常漂亮地回答了這個部分,我將重點放在第二部分。
如果在兩者的功能如何被評估
對TL方面的任何差異; dr爲沒有差別和所產生的組件實際上是相同的。我們將使用一個簡單的斐波那契示例來顯示使用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
$
這是非常常見的有僅包含OCaml中match
表情功能,從而@JeffreyScofield說,function
具有可用於模式MA參數tching。因此,它是有效的語法糖。
來源:
是的,有點令人困惑,我們有3個函數定義語法,並在參數綁定方面模式匹配 - 是的,你可以模式匹配左等號。 –
Colin G.D.在OCaml中有一篇關於函數式編程的簡介(www.france-universite-numerique-mooc.fr)。它仍然是開放的。他本週開始(由Xavier Leroy介紹)。 –
嗨@ V.Michel我知道這個mooc,我的老師是背後的老師,不過謝謝你。 –