虽然我觉得自己对 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
那么为什么要x在IO()变体中省略参数呢?
.,函数组合运算符,需要一个函数。show x然而不是一个函数;[Char]当它被赋予时,它是一个评估值(类型).。
您必须改用函数应用程序运算符:
printtoscreen x = putStrLn $ show x
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
53 次 |
| 最近记录: |