Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 关于IO和do符号的混淆_Haskell_Io_Monads - Fatal编程技术网

Haskell 关于IO和do符号的混淆

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中工

我是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
块要在
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) }