n + k шаблонов в F #? - PullRequest
       3

n + k шаблонов в F #?

0 голосов
/ 22 октября 2010

Я написал следующее на F #:

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

К сожалению, я получил ошибку компилятора, указав, что я использовал инфиксный оператор в неожиданном месте.Кроме использования подстановочного знака, есть ли способ выразить свое намерение в F #?

Ответы [ 3 ]

6 голосов
/ 22 октября 2010

Вы можете получить это, определив активный паттерн. Я не совсем уверен, как 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 голос
/ 22 октября 2010

F # не поддерживает n + k шаблонов , но вы можете переписать его с точки зрения n :

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

Обратите внимание, что рекурсивные функции вF # нужно ключевое слово rec, в отличие от Haskell.

1 голос
/ 22 октября 2010

Я бы вычел -2 с обеих сторон. И вам нужно добавить ключевое слово rec, потому что вы объявляете рекурсивную функцию.

так вы получите:

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