Haskell 打印阶乘

Posted

技术标签:

【中文标题】Haskell 打印阶乘【英文标题】:Haskell print factorial 【发布时间】:2015-02-04 20:19:56 【问题描述】:

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

现在我正在尝试简单地找到 4 的阶乘并将其打印出来,这就是我到目前为止所写的:

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

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

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

我做错了什么?

【问题讨论】:

是什么让您认为 Haskell 在数学上比 C# 或其他任何东西“更强大”?这是一种计算阶乘的幼稚方法。研究 lngamma 函数以获得更好的想法。 为什么是lngamma 而不是gamma? OP 不想要阶乘的自然对数。 Duffymo,我知道 C# 在数学上也很强大,但据我所知,与 C# 相比,编写高效代码所需的 Haskell 知识更少;因为我正在处理阶乘,所以数字增长得非常快,在 C# 中我使用 Biginteger 来处理它,但我对它不太满意。基本上我的最终代码会进行阶乘和平方根。它检查是否存在第一个阶乘 +1 是第二个平方的数字对。 [4,5], 4!=24; 24+1=25; sqrt(25)=5. 使用 lngamma 是因为它可以延缓溢出问题,并且可以很自然地评估置换和组合公式。 Duffymo,英语不是我的母语,如果我缺少您认为合适的技术术语,我很抱歉。我会尽量把我的词汇量塑造成你觉得合适的样子 【参考方案1】:

你需要括号:

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)))

【讨论】:

以上是关于Haskell 打印阶乘的主要内容,如果未能解决你的问题,请参考以下文章

Haskell入门篇三:递归

如何在 haskell 中打印列表?

haskell中的查找表加速

Haskell 中的打印机用于 Data.Comp.Variables 中的 Subst

在Haskell中表达一个简单的递归函数的问题[重复]

Haskell:如何将秒数漂亮地打印为日期和时间?