2013-10-09 113 views
1

我的測試函數有什麼問題?F#函數類型不匹配

let divisorOf(d, n) = n % d = 0 

let notDivisible(d, n) = not (divisorOf(d, n)) 

let rec test(a, b, c) = function 
    | (a, b, _) when (a > b) -> true 
    | (a, b, c) -> notDivisible(a, c) && test(a + 1, b, c) 

我得到一個編譯器錯誤,第7行上的表達式具有函數類型,而不是bool。

(7,40): error FS0001: This expression was expected to have type 
    bool  
but here has type 
    'a * 'a * 'b -> bool  

回答

5

當您使用關鍵字function您正在創建一個implict lambda。據推測,對此的輸入是int*int*int。爲了解決這個問題剛剛得到改變

let rec test(a,b,c) = 

如果你想明確的論據,你也可以把它寫成

let rec test(d, e, f) = match (d,e,f) with //change letters to avoid variable hiding 
    | (a, b, _) when (a > b) -> true 
    | (a, b, c) -> notDivisible(a, c) && test(a + 1, b, c) 
2

約翰的回答是完全正確的,但對於爲了其他人可能會閱讀這篇文章,這是您發佈的代碼的更習慣形式:

let divisorOf d n = n % d = 0 

let notDivisible d n = not <| divisorOf d n 
//Could also be let notDivisible d n = not(divisorOf d n) 

let rec test = 
    function 
    | (a, b, _) when (a > b) -> true 
    | (a, b, c) -> (notDivisible a c) && test (a + 1, b, c) 

我只想指出這一點,因爲在divisorOf和notDivisible上你已經爲參數聲明瞭一個元組,並且當不習慣寫入curried參數的人開始編寫F#時,這是一個常見問題。

我只發表這個作爲答案,因爲它有點太長的評論。