Haskell Printf文本和方法调用的返回值

Haskell Printf文本和方法调用的返回值,haskell,printf,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) import Text.Printf 阶乘n

免责声明:我是哈斯克尔的新手,但我找不到答案。也许我搜索的方式不对,或者它太基本了,以至于没有人问我

以下是我尝试做的:

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)
import Text.Printf
阶乘n=如果n<2,则1其他n*阶乘(n-1)
main=do
让输入=22
printf“某些文本…%d!=%d”输入(阶乘输入)

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

唯一的
输入在你的代码中是不明确的类型

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 ()
import Text.Printf
阶乘n=如果n<2,则1其他n*阶乘(n-1)
main=do
让输入=22::整数
printf“某些文本…%d!=%d”输入(阶乘输入)
返回()

代码中唯一的
输入类型不明确

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 ()
import Text.Printf
阶乘n=如果n<2,则1其他n*阶乘(n-1)
main=do
让输入=22::整数
printf“某些文本…%d!=%d”输入(阶乘输入)
返回()

问题在于编译器无法推断
输入的类型。为此,您需要明确提供:

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)
import Text.Printf
阶乘n=如果n<2,则1其他n*阶乘(n-1)
main=do
让输入=22::整数
printf“某些文本…%d!=%d”输入(阶乘输入)
请注意,
Integer
将适用于非常大的结果,而
Int
则不适用,引用:

“整数”是一种任意精度类型:它将包含任何数字 无论多大,都会达到您机器内存的极限…。这意味着 你永远不会有算术溢出。另一方面,它也意味着 你的算术比较慢。Lisp用户可以识别 这里输入“bignum”

“Int”是更常见的32位或64位整数。实施方式各不相同, 尽管保证至少为30位


问题是编译器无法推断
输入的类型。为此,您需要明确提供:

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)
import Text.Printf
阶乘n=如果n<2,则1其他n*阶乘(n-1)
main=do
让输入=22::整数
printf“某些文本…%d!=%d”输入(阶乘输入)
请注意,
Integer
将适用于非常大的结果,而
Int
则不适用,引用:

“整数”是一种任意精度类型:它将包含任何数字 无论多大,都会达到您机器内存的极限…。这意味着 你永远不会有算术溢出。另一方面,它也意味着 你的算术比较慢。Lisp用户可以识别 这里输入“bignum”

“Int”是更常见的32位或64位整数。实施方式各不相同, 尽管保证至少为30位


您做得很好,但编译器无法推断
输入的类型,这就是为什么您会有许多错误,例如
没有实例…
“出现一堆错误”——请避免在不报告实际错误的情况下发布这些错误。此外,
printf
在Haskell中并不经常使用——只有在需要特殊格式时才使用它。否则,只需使用一些更简单的方法,比如
putStrLn(“x=“++show x++”,y=“++show y)
,你做得很好,但编译器无法推断
输入的类型,这就是为什么你有很多错误,比如
没有实例…
“出现了一堆错误”——请避免在没有报告实际错误的情况下发布这些错误。此外,
printf
在Haskell中并不经常使用——只有在需要特殊格式时才使用它。否则,只需使用比您更简单的
putStrLn(“x=“++show x++”,y=“+++show y)
,就可以了。但现在它是一个int,它的最大大小是有限的。如果我这样做:打印(阶乘22),它似乎不是int,因为它显示的是正确的值,而不是int max size。知道吗?是我的错。应该是
::Integer
比您更有效。但现在它是一个int,它的最大大小是有限的。如果我这样做:打印(阶乘22),它似乎不是int,因为它显示的是正确的值,而不是int max size。知道吗?是我的错。它应该是
::Integer