首页 > 解决方案 > 组合不同类型的流

问题描述

根据流式教程,可以使用<>运算符(从by重新导出)组合不同的流,如下所示:Semigroupstreamly

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 ((&))

标签: haskellstreamingstreamly

解决方案


由于S.mapM仅适用于已经是 monad 的东西,因此您可以将它们转换为共享类型——比如包含Strings 的类型——然后遍历共享流类型。print只是putStrLn . show,所以:

runStream $ (show <$> ((readLn :: IO Int) |: nil)) <> (show <$> ((readLn :: IO [Char]) |: nil)) & S.mapM putStrLn

推荐阅读