2010-10-22 4 views
0

j'ai écrit ce qui suit dans F #:n + k modèles en F #?

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

Malheureusement, je suis une erreur de compilation indiquant que j'avais utilisé un opérateur infixe dans un endroit inattendu. En dehors de l'utilisation du caractère générique, y a-t-il un moyen d'exprimer mon intention en F #?

+1

Je ne suis pas Haskeller, mais je l'ai entendu dire que les modèles 'n + K' doivent être évités si possible (http: // www. haskell.org/haskellwiki/Haskell_programming_tips/Discussion#n.2Bk_patterns). – Juliet

Répondre

1

F # ne supporte pas n+k patterns, mais vous pouvez réécrire en termes de juste n:

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

Notez que les fonctions récursives en F # ont besoin de la rec mot-clé, contrairement à Haskell.

+0

Je dois obtenir plus rapidement en affichant mes réponses :) – PetPaulsen

1

Je voudrais soustraire -2 des deux côtés. Et vous devez ajouter le mot clé rec, car vous déclarez une fonction récursive.

si vous obtenez:

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

Vous pouvez obtenir cela en définissant un motif actif. Je ne suis pas sûr de savoir comment n + k modèles fonctionnent avec Haskell, mais ce qui suit devrait être un bon début (par exemple, peuvent-ils jamais échouer?):

// 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) 

EDIT: D'après le commentaire par sepp2k, voici une version mise à jour échoue si « n » serait négative:

// Result of matching 'input' against 'add + k' 
let (|PlusNum|_|) add input = 
    if input - add < 0 then None 
    else Some(input - add) 
+0

Oui, ils peuvent échouer dans Haskell. Spécifiquement, ils ne correspondent pas si 'n' serait négatif. – sepp2k

+0

@ sepp2k: Hmm ... est-ce que ça veut dire que "n" sera toujours positif? C'est intéressant (je m'attendrais à ce que ça puisse être négatif aussi). Il est bon qu'une fonctionnalité comme celle-ci ne soit pas intégrée dans le langage F # et que vous puissiez prendre des décisions de conception vous-même :-) –

+0

Cela peut aussi être 0. Mais pas négatif. Notez que vous n'êtes pas la seule personne qui trouve cela étrange et que les modèles n + k n'existent plus dans Haskell 2010. – sepp2k

Questions connexes