haskell - 组合不同类型的流
问题描述
根据流式教程,可以使用<>
运算符(从by重新导出)组合不同的流,如下所示:Semigroup
streamly
runStream $ ((readLn :: IO Int) |: nil) <> ((readLn :: IO Int) |: nil) & S.mapM print
但是,我想组合具有不同类型的流,但两者都适用于print
. 像这样的东西:
runStream $ ((readLn :: IO Int) |: nil) <> ((readLn :: IO [Char]) |: nil) & S.mapM print
但这给了我一个错误:
<interactive>:27:45: error:
• Couldn't match type ‘[Char]’ with ‘Int’
Expected type: SerialT IO Int
Actual type: SerialT IO [Char]
• In the second argument of ‘(<>)’, namely
‘((readLn :: IO [Char]) |: nil)’
In the first argument of ‘(&)’, namely
‘((readLn :: IO Int) |: nil) <> ((readLn :: IO [Char]) |: nil)’
In the second argument of ‘($)’, namely
‘((readLn :: IO Int) |: nil) <> ((readLn :: IO [Char]) |: nil)
& S.mapM print’
关于如何做到这一点的任何提示?
上面的代码已经运行ghci
,这些是导入:
import Streamly
import Streamly.Prelude ((|:), nil)
import qualified Streamly.Prelude as S
import Data.Function ((&))
解决方案
由于S.mapM
仅适用于已经是 monad 的东西,因此您可以将它们转换为共享类型——比如包含String
s 的类型——然后遍历共享流类型。print
只是putStrLn . show
,所以:
runStream $ (show <$> ((readLn :: IO Int) |: nil)) <> (show <$> ((readLn :: IO [Char]) |: nil)) & S.mapM putStrLn
推荐阅读
- python - 在 QImage 上绘制矩形而不显示它
- nestjs - 有没有办法在nestjs中动态订阅websocket服务器中的事件
- python - 有没有一种简单的方法可以确保 matplotlib 子图保持正方形并且不与第二个子图重叠?
- shiny - 使用 JavaScript 在 DataTable 中用颜色格式化行
- flutter - AnimatedSize 裁剪小部件
- build - 从命令行指定 msbuild 包目录
- python - Pandas 获取对象 dtype 中所有数据类型的列表
- amazon-web-services - 为什么我仍然被亚马逊 S3 收费
- javascript - 将鼠标悬停在图像上的另一个 div 上会打断我的 onmouseenter
- java - 如何通过标签从与其他类同名的跨度类中获取元素?