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 type
IO ()' 函数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 看到的是 fact
和 4
作为单独的参数传递给 print
,但您想要将 4
应用到 fact
,然后将该结果应用到 print
。你也可以使用
main = do
print $ fact 4
$
运算符本身不执行任何操作,但它的优先级非常低,例如 +
的优先级低于 *
,并且它关联到右侧,因此您可以编写类似
f $ g . h $ m 1 $ 2 + 3
而不是
f ((g . h) (m 1 (2 + 3)))
【讨论】:
以上是关于Haskell 打印阶乘的主要内容,如果未能解决你的问题,请参考以下文章