据我理解这个功能确实比这个
你是在正确的两段代码进行评估一样一样的。
可能有人请帮助我理解第一功能
的语法@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,我的老师是背后的老师,不过谢谢你。 –