2011-10-06 78 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