2017-09-01 150 views
0

這是我的代碼這個錯誤是什麼意思,以及如何解決它?

let rec Interest a b c = 
    if (c=0) then b else Interest(a ((1.0+a)*b) (c-1));; 

錯誤是:

如果(C = 0),則b,否則利息(一個((1.0 +α)* B)(C-1)); ;

------------------------- ^^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^

標準輸入(2,26):錯誤FS0001:類型不匹配。期待 '一但給予 ' 一 - > INT - > 'a '和'A' 一個統一時所得到的類型將是無限' - > INT - > '一個' >

+0

[F#類型不匹配時調用函數]可能重複(https://stackoverflow.com/questions/32236509/f-type-mismatch-while-calling-function) – scrwtp

回答

5

您已將Interest定義爲一個接受三個參數的函數,但您傳遞的內容與該參數不匹配。它的寫法是,你只傳遞給Interest的遞歸調用的單個參數 - 括號中的表達式​​。在這裏,a被推斷爲兩個參數,((1.0=a)*b)(c-1)功能。

長話短說,這拋棄了類型推理算法,直到它放棄說它不能給Interest給出什麼類型的掛起。

你想要的是這樣的:

let rec Interest a b c = 
    if (c=0) then b else Interest a ((1.0=a)*b) (c-1) 

你也有一個問題,(1.0=a)。這將評估爲一個布爾值,您稍後需要將其與b相乘。不知道意圖是什麼,但你可能正在尋找像(if 1.0 = a then 1 else 0)

與支持「布爾變量」和整數之間的隱式轉換C的語言,F#要求,使所有轉換明確,以確保正確性(這也適用於數值類型之間的轉換以及)。

+1

它不是一個元組。沒有逗號。它將「a」視爲兩個參數的函數。 –

+0

謝謝,你當然是對的。 – scrwtp

+0

謝謝你,所以把括號周圍的3個參數引發的問題,但有沒有辦法把周圍參數的括號...以冗餘明確3個ARGS中傳遞?附:編輯(1.0 = a)..這是一個錯字 – greg

相關問題