Haskell打印阶乘



我刚刚开始编程Haskell,主要是因为我在寻找一种比C#更强大的数学语言,现在我很困惑。

现在我正试图简单地找到4的阶乘并打印出来,这就是我迄今为止所写的:

fact n = product [1..n]
main = do
   print fact 4

当我试着调试它时,我得到了

错误:(3,8)ghc:无法匹配预期的类型a1 -> t0' with actual type IO()'函数print' is applied to two arguments, but its type(a0->a0)->IO()'只有一个在"do"块的stmt中:打印事实4在表达式中:do{print fact 4}

我做错了什么?

您需要括号:

main = do
    print (fact 4)

GHC看到的是fact4作为单独的参数传递给print,但您想要的是将4应用于fact,然后将结果应用于print。你也可以使用

main = do
    print $ fact 4

$操作符本身不做任何事情,但它的优先级很低,比如+的优先级低于*,并且它关联到右边,所以你可以写一些类似的东西

f $ g . h $ m 1 $ 2 + 3

代替

f ((g . h) (m 1 (2 + 3)))