[英]Composing streamly streams of different types
具體根據streamly教程 ,也能夠使用不同的流組合<>
運算符( 再出口從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
的類型),然后遍歷共享流類型。 print
只是putStrLn . show
putStrLn . show
,所以:
runStream $ (show <$> ((readLn :: IO Int) |: nil)) <> (show <$> ((readLn :: IO [Char]) |: nil)) & S.mapM putStrLn
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.