我在F#中写了以下内容:
let fib x =
match x with
| 0 -> 0
| 1 -> 1
| n+2 -> fib n + fib (n+1)
Run Code Online (Sandbox Code Playgroud)
不幸的是,我收到一个编译器错误,说明我在意外的地方使用了一个中缀操作符.除了使用通配符之外,有没有办法在F#中表达我的意图?
您可以通过定义活动模式来实现这一点.我不确定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)
Run Code Online (Sandbox Code Playgroud)
编辑:根据sepp2k的评论,这是一个更新版本,如果"n"为负,则失败:
// Result of matching 'input' against 'add + k'
let (|PlusNum|_|) add input =
if input - add < 0 then None
else Some(input - add)
Run Code Online (Sandbox Code Playgroud)