F#中的n + k个模式?

时间:2010-10-22 07:43:29

标签: f# pattern-matching

我在F#中写了以下内容:

let fib x = 
  match x with
  | 0 -> 0
  | 1 -> 1
  | n+2 -> fib n + fib (n+1)

不幸的是,我收到一个编译器错误,说明我在一个意想不到的地方使用了一个中缀操作符。除了使用通配符之外,有没有办法在F#中表达我的意图?

3 个答案:

答案 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关键字。