F#中的n + k个模式?

0 f# pattern-matching

我在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#中表达我的意图?

Tom*_*cek 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)
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)