printf文本和方法调用的返回值

时间:2017-05-30 08:20:47

标签: haskell printf

免责声明:我是哈斯克尔的新手,但我找不到答案。也许我正在以错误的方式搜索,或者它是如此基本,甚至没有人问过。

这是我尝试做的事情:

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)

但这不起作用,会出现一堆错误。你能给我一个快速提示吗,我做错了什么?

2 个答案:

答案 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位。