2011-10-06 80 views
0

我使用擁抱編譯一個簡單的Haskell函數來計算排列的數量。我希望它返回一個整型,但我需要在浮動上操作。 我試圖計算答案作爲一個浮動,然後截斷它,但由於某種原因,它不工作。類型錯誤Haskell,有什麼問題?

這是功能:

choose :: Float -> Float -> Integer 
choose n r = truncate (chooseF (n r)) 
    where 
     chooseF::Float->Float->Float 
     chooseF n r | n==r = 1 
         | otherwise = n/(n-r) * chooseF(n-1) r 

這是錯誤(第35行是函數的第二行):

ERROR "/homes/mb4110/SimpleMath":35 - Type error in application 
*** Expression  : n r 
*** Term   : n 
*** Type   : Float 
*** Does not match : a -> b 

這可能是一些很明顯我失蹤,但我我們一直在這裏待了很長時間,想不到解決方案。

+0

由於我稱之爲「Caskell」造成的另一個缺陷。 Haskell不是C ...不要使用f(n),使用f n。另外,使用ghci。 – alternative

回答

4

chooseF需要兩個參數,但由於括號n r被解析爲單個參數。因此,刪除n r的圓括號,應該沒問題。

+0

謝謝,現在它正在工作。另一個說明是(n)數據結構? – Maciek

+0

不,(n r)不是一個有效的表達式,如果在這種情況下,n和r都是Float類型。如果n是一個函數,這將是一個有效的表達式,因爲那樣它就是函數應用程序。 – bzn

+6

'(n r)'在語法上是有效的,因爲它代表'n'對'r'的應用,但它在語義上不是有效的,因爲'n'不是函數。 – pat

2

問題是,你通過(n r)chooseF。擁抱從這裏決定,術語n必須是a -> b類型的某個函數,其中您傳遞的是r。其結果將部分應用於chooseF

推測,您想以nr作爲參數調用chooseF。要解決此錯誤,請改爲撥打chooseF n r