bugfix> haskell > 投稿

としてストリームリーなチュートリアル、 <> を使用して異なるストリームを結合することが可能です演算子(再輸出  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 ((&))

回答 1 件
  • S.mapM から  すでにモナドであるものでのみ動作します。おそらく、それらを共有型に変換できます。たとえば、 String を含むもの s-次に、共有ストリームタイプをトラバースします。 print  ただ putStrLn . show です 、 そう:

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

あなたの答え