Haskell IO-Monad 在明确声明“show”参数时出错

vri*_*aam 1 haskell io-monad

虽然我觉得自己对 Haskel IO 和 Monads 有很好的理解,但我很难理解以下错误消息。

考虑以下 Haskell 中的简单函数

testf :: Show a => a -> String
testf x = show x
Run Code Online (Sandbox Code Playgroud)

我尝试使用 IO Monad 实现一个打印到控制台的变体

printtoscreen :: Show a => a -> IO()
printtoscreen x = putStrLn . show x
Run Code Online (Sandbox Code Playgroud)

但是,这会产生以下错误:

无法将类型“[Char]”与“a0 -> String”匹配 预期类型:a0 -> String 实际类型:String

正确的版本应该省略明确说明x参数

printtoscreen :: Show a => a -> IO()
printtoscreen = putStrLn . show
Run Code Online (Sandbox Code Playgroud)

我明白为什么最后一个代码片段有效,但我无法理解第二个代码片段的错误消息,因为它也会返回一个字符串 putStrLn

那么为什么要xIO()变体中省略参数呢?

Car*_*ate 5

.,函数组合运算符,需要一个函数。show x然而不是一个函数;[Char]当它被赋予时,它是一个评估值(类型).

您必须改用函数应用程序运算符:

printtoscreen x = putStrLn $ show x
Run Code Online (Sandbox Code Playgroud)