免责声明:我是哈斯克尔的新手,但我找不到答案。也许我正在以错误的方式搜索,或者它是如此基本,甚至没有人问过。
这是我尝试做的事情:
import Text.Printf
factorial n = if n < 2 then 1 else n * factorial (n-1)
main = do
let input = 22
printf "Some text... %d! = %d" input (factorial input)
但这不起作用,会出现一堆错误。你能给我一个快速提示吗,我做错了什么?
答案 0 :(得分:2)
代码中唯一的input
是不明确的类型。
import Text.Printf
factorial n = if n < 2 then 1 else n * factorial (n-1)
main = do
let input = 22::Integer
printf "Some text... %d! = %d" input (factorial input)
return ()
答案 1 :(得分:1)
问题是编译器无法推断input
的类型。要做,你需要明确地提供它:
import Text.Printf
factorial n = if n < 2 then 1 else n * factorial (n-1)
main = do
let input = 22 :: Integer
printf "Some text... %d! = %d" input (factorial input)
请注意,Integer
将适用于非常大的结果,而Int
则不会引用Haskell Wikibook:
“整数”是一种任意精度类型:它将保留任何数字号 无论机器的记忆有多大,都达到极限......这意味着 你永远不会有算术溢出。另一方面,它也意味着 你的算术比较慢。 Lisp用户可能会认识到 “bignum”在这里输入。
“Int”是更常见的32位或64位整数。实施方式各不相同 虽然它保证至少30位。