Haskell 使用管道。IO操作安全

Haskell 使用管道。IO操作安全,haskell,haskell-pipes,haskell-pipes-safe,Haskell,Haskell Pipes,Haskell Pipes Safe,我使用的是Pipes.Files,它反过来又依赖于Pipes.Safe。我有这样一条管道: 导入管道 导入管道文件 进口管道,安全 进口合格管道。前奏部分为P 所有文件::(MonadIO m,MonadSafe m)=>FilePath->Producer FilePath m() 所有文件路径=查找路径(全局“*.hs”常规) main::IO() main=do args P.mapM(liftIO.analyze conf) >->P.map(filterResults配置) >->P.

我使用的是Pipes.Files,它反过来又依赖于Pipes.Safe。我有这样一条管道:

导入管道
导入管道文件
进口管道,安全
进口合格管道。前奏部分为P
所有文件::(MonadIO m,MonadSafe m)=>FilePath->Producer FilePath m()
所有文件路径=查找路径(全局“*.hs”常规)
main::IO()
main=do
args P.mapM(liftIO.analyze conf)
>->P.map(filterResults配置)
>->P.过滤器
runSafeT$runEffect$exportStream配置源
问题是
analyze
的类型是

analyze :: Config -> FilePath -> IO Result
allFiles
具有
MonadSafe m
MonadIO m
约束。理论上,
liftIO
应该注意这一点,但是我得到了这个错误:

Main.hs:45:22:
    No instance for (Pipes.Safe.MonadSafe IO)
      arising from a use of ‘allFiles’
    In the first argument of ‘(>->)’, namely ‘allFiles path’
    In the first argument of ‘(>->)’, namely
      ‘allFiles path >-> P.mapM (liftIO . analyze conf)’
    In the first argument of ‘(>->)’, namely
      ‘allFiles path >-> P.mapM (liftIO . analyze conf)
       >-> P.map (filterResults conf)’

Main.hs:49:20:
    Couldn't match type ‘IO’ with ‘Pipes.Safe.SafeT IO’
    Expected type: Pipes.Safe.SafeT IO ()
      Actual type: IO ()
    In the second argument of ‘($)’, namely
      ‘runEffect $ exportStream conf source’
    In a stmt of a 'do' block:
      runSafeT $ runEffect $ exportStream conf source
    In the expression:
      do { let source
                 = allFiles path >-> P.mapM (liftIO . analyze conf)
                   >-> P.map (filterResults conf)
                   >-> P.filter filterNulls;
           runSafeT $ runEffect $ exportStream conf source }
还有第二个错误,我现在不知道如何解释

编辑:以下是其他类型的签名:

filterResults::Config->Result->Result
filterNulls::结果->布尔
exportStream::Config->Producer Result IO()->Effect IO()

exportStream的类型是什么?@Cirdec I在问题中添加了类型签名。似乎
runEffect
返回的是
IO()
类型的东西,这导致了类型不匹配。@user2407038,这也可能是因为
exportStream
返回
Effect IO()
@ØrjanJohansen你是对的,这就是问题所在。我已经尝试过这个解决方案,但我忘了将
MonadIO m
约束添加到
exportStream
所使用的所有函数中。exportStream的类型是什么?@Cirdec我在问题中添加了类型签名。似乎
运行效果
正在返回某种类型的
IO()
,这会导致这种类型不匹配。@user2407038,这也可能是因为
exportStream
返回
Effect IO()
@rjanJohansen您是对的,这就是问题所在。我已经尝试过这个解决方案,但是我忘记了将
MonadIO m
约束添加到
exportStream
使用的所有函数中。