Haskell 关于IO和do符号的混淆
我是Haskell的初学者,对我写的代码感到困惑Haskell 关于IO和do符号的混淆,haskell,io,monads,Haskell,Io,Monads,我是Haskell的初学者,对我写的代码感到困惑 readRecords :: String -> [Either String Record] readRecords path = do f <- B.readFile path map parseLogLine (C8.lines f) readRecords::String->[任一字符串记录] readRecords路径=do f作为起点,readRecords的定义类型错误。如果do块要在IOmonad中工
readRecords :: String -> [Either String Record]
readRecords path = do
f <- B.readFile path
map parseLogLine (C8.lines f)
readRecords::String->[任一字符串记录]
readRecords路径=do
f作为起点,readRecords
的定义类型错误。如果do
块要在IO
monad中工作,那么它将生成一个IO
值,但您已将其定义为返回[]
monad中的[任一字符串记录]
。这意味着您不能调用返回IO
的B.readFile
而不触发您得到的类型错误
修复该问题后,您会发现do块最后一行上的map
表达式的类型错误,因为它在应该生成IO[任一字符串记录]
时生成了[任一字符串记录]
。在return
中包装调用以解决此问题。作为起点,readRecords
使用错误的类型定义。如果do
块要在IO
monad中工作,那么它将生成一个IO
值,但您已将其定义为返回[]
monad中的[任一字符串记录]
。这意味着您不能调用返回IO
的B.readFile
而不触发您得到的类型错误
修复该问题后,您会发现do块最后一行上的map
表达式的类型错误,因为它在应该生成IO[任一字符串记录]
时生成了[任一字符串记录]
。将调用包装在return
中以解决此问题。非常感谢,我将return类型更改为IO[…]
,并使用了您所说的return at last语句。我将在9分钟后接受您的回答。非常感谢,我已将返回类型更改为IO[…]
,并使用了您所说的“在最后一次声明时返回”。我会在9分钟后接受你的回答。
Main.hs:15:10:
Couldn't match type `IO' with `[]'
Expected type: [C8.ByteString]
Actual type: IO C8.ByteString
In the return type of a call of `B.readFile'
In a stmt of a 'do' block: f <- B.readFile path
In the expression:
do { f <- B.readFile path;
map parseLogLine (C8.lines f) }