2014-10-27 81 views
1

我嘗試使用模式匹配這樣實現在F#Fibonacci序列:F#模式匹配和功能

let fibonacci m= 
    let rec fib = function 
     | (0, _, z) -> z 
     | (n, y, z) -> fib (n-1) z (y+z) 
    fib m 0 1 

在這裏,我想到的第一個參數撒謊跟蹤多遠沿着序列我們在,接下來的兩個參數是序列中的連續項。

不過,我對fib (n-1) z (y+z)得到一個編譯時錯誤:

Type mismatch. Expecting a 
    'a -> 'b -> 'c  
but given a 
    'c  
The resulting type would be infinite when unifying ''a' and ''b -> 'c -> 'a' 

我試圖指定類型,像這樣:

let fibonacci m= 
    let rec fib = function 
     | (0, _, z:int) -> z 
     | (n:int, y:int, z:int) -> fib (n-1) z (y+z) 
    fib m 0 1 

然後我得到fib (n-1)不同的編譯錯誤:

This value is not a function and cannot be applied 

我仍然試圖讓我的頭在functiona l編程。我認爲問題可能是我對第一種模式的實際含義缺乏瞭解。我想這意味着當位置參數爲零時,它返回第二個參數項。

可能有人能幫我解決這個問題,這顯然是因爲對我而言有些基本的誤解

回答

5

的問題是你打電話的時候,其實是指期待tupled參數咖喱參數的函數:

let fibonacci m = 
    let rec fib = function 
     | (0, _, z) -> z 
     | (n, y, z) -> fib (n-1, z, y+z) 
    fib (m, 0, 1) 

這是因爲您正在使用function哪種模式匹配單個參數,在您的情況下針對元組。另一種方法是使用match

let fibonacci m = 
    let rec fib a b c = 
     match (a, b, c) with 
     | (0, _, z) -> z 
     | (n, y, z) -> fib (n-1) z (y+z) 
    fib m 0 1 

你能想到的function作爲一個單獨的參數功能,然後在match這樣的說法的簡寫。

+0

權利是有道理的,我想你只能在一個單一的實體上真正的模式匹配,而不是參數列表 – 2014-10-27 15:14:40

+0

是的,你可以。查看帶有匹配...的示例的更新。 – Gustavo 2014-10-27 15:15:32