【发布时间】:2021-10-18 02:33:46
【问题描述】:
我有以下功能:
getBoard :: String
getBoard = do
contents <- readFile "src/board.txt"
return contents
我收到了这个错误:
• 无法将类型“IO”与“[]”匹配 预期类型:[字符串] 实际类型:IO String
已经在互联网上阅读了很多东西,显然我的代码应该可以工作。谁能告诉我怎么了?
Obs:当我去 repl 做:
contents <- readFile "src/board.txt"
然后:
:type contents
它告诉我内容是一个字符串。所以,我无法弄清楚为什么我会收到上面提到的错误。
注意:getBoard 函数必须返回一个字符串
【问题讨论】:
-
你也可以向repl询问
return的类型。在 Haskell 中,return只是一个函数。它的类型是:return :: Monad m => a -> m a。现在的问题是:您想要或期望哪个 monad? -
你的意思是我需要另一个类型为 IO String -> String 的函数?
-
@ThallesPortilho 类型系统不会让您在函数中产生任意副作用:“getBoard 函数必须返回一个字符串”它实际上不能。或者换一种说法,如果你想让一个函数返回一个纯字符串,它不能从文件(或 STDIN,或...)中读取它。
-
@ThallesPortilho 好吧,库中存在
IO a -> a类型的多态函数。 Hoogle 会很乐意为您指出它,这是unsafePerformIO。但线索就在名字里。例如,如果您使用getLine到unsafePerformIO,您将始终阅读同一行,因为引用透明。 older question 中的详细信息由结束您的问题的人指出
标签: haskell