2017-05-30 37 views
0

声明:我是haskell的总newb,但找不到答案。也许我以错误的方式寻找,或者如此基本,甚至没有人问这个问题。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) 

但是,这并不工作,一堆错误出现。你能给我一个简短的提示,我做错了什么?

+1

你做的不错,但是编译器不能推断'input'的类型,这就是为什么你有很多错误,如'不实例...' – freestyle

+0

“一堆错误出现” - 请注意避免发布,而不报告实际的错误。此外,'printf'在Haskell中并不经常使用 - 只有在需要特殊格式时才使用它。否则,只需使用像'putStrLn(“x =”++ show x ++“,y =”++ show y)“这样简单的东西''''' – chi

回答

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

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() 
+0

比你更有效。但现在它是一个整数,它的最大尺寸是有限的。如果我这样做:print(factorial 22),它似乎并不是一个整数,因为它显示的是正确的值而不是int max的大小。任何想法? – jdstaerk

+0

我的错。它应该是':: Integer' – palik

+0

啊好的,谢谢! – jdstaerk