我正在使用Idone.com网站并希望运行此代码,但不知道从stdin编译的语法putStrLn使用此代码但剥离错误。
main = putStrLn (show (sumaCifras x))
sumaCifras:: Int -> Int
sumaCifras x = div x 1000 + mod (div x 100) 10 + mod (div x 10) 10 + mod x 10
答案 0 :(得分:4)
编译器遇到问题,因为你在main函数中使用x,它不受此范围的约束。首先,您必须从输入中读取值,然后将其传递给您的函数。你可以用两种方式做到这一点。
对于习惯性语言的人来说,更自然的是“do”语法,它看起来像这样:
main = do
x <- getLine
putStrLn (show (sumaCifras (read x :: Int)))
当你想使用x作为Int时,必须使用带有类型签名的“read”函数,这样编译器就会知道会发生什么。
要以更多功能的方式编写它,您可以使用monad转换,像那样传递它
main = getLine >>= (\x -> putStrLn(show (sumaCifras (read x :: Int)))
“&gt;&gt; =”运算符将从第一个monadic动作获取结果值(此处为获取输入的IO动作)并将其应用于右侧的函数(此处为读取输入的lambda函数)整数,应用您的函数并将其返回到putStrLn,它将其打印在屏幕上)。 “do”语法本质上只是这个monadic操作的语法糖,所以它不会影响程序的执行或性能。
通过完全无点地编写
,你可以更进一步地进行功能性写作 main = getLine >>= (putStrLn . show . sumaCifras . (read :: String -> Int))
请注意,这里有读取函数的类型签名,而不是将此函数应用于参数,因此String - &gt;诠释。在这里首先执行的是getLine函数。然后将从它获得的输入传递给读取,然后将其转换为Int,接下来是sumaCifras,然后通过show将其转换为String并使用putStrLn打印。