我在F#中写了以下内容:
let fib x =
match x with
| 0 -> 0
| 1 -> 1
| n+2 -> fib n + fib (n+1)
不幸的是,我收到一个编译器错误,说明我在一个意想不到的地方使用了一个中缀操作符。除了使用通配符之外,有没有办法在F#中表达我的意图?
答案 0 :(得分:6)
你可以通过定义活动模式来实现这一点。我不确定n + k模式如何与Haskell一起工作(例如,它们是否会失败?),但以下应该是一个良好的开端:
// Result of matching 'input' against 'add + k'
let (|PlusNum|) add input =
input - add
let rec fib = function
| 0 -> 0
| 1 -> 1
| PlusNum 2 n -> fib n + fib (n+1)
编辑:根据sepp2k的评论,如果“n”为负数,则更新版本失败:
// Result of matching 'input' against 'add + k'
let (|PlusNum|_|) add input =
if input - add < 0 then None
else Some(input - add)
答案 1 :(得分:1)
我会在两边减去-2。 而且你必须添加rec关键字,因为你声明了一个递归函数。
所以你得到:
let rec fib x =
match x with
| 0 -> 0
| 1 -> 1
| n -> fib (n - 2) + fib (n - 1)
答案 2 :(得分:1)
F#不支持n+k patterns,但你可以用 n 重写它:
let rec fib x =
match x with
| 0 -> 0
| 1 -> 1
| n -> fib (n - 2) + fib (n - 1)
请注意,与Haskell不同,F#中的递归函数需要rec
关键字。