Haskell 如何将函数应用于流媒体库生成的流中的值

Haskell 如何将函数应用于流媒体库生成的流中的值,haskell,streaming,Haskell,Streaming,我正在使用流库生成一个流值,但使用简单函数转换流时遇到问题 有人能给我指一下正确的方向吗 #!/usr/bin/env stack import Streaming import qualified Streaming.Prelude as S import Data.Maybe stream :: Stream (Of (Maybe Integer)) Maybe () stream = S.each [Just 1, Just 2, Just 3, Just 4, Just 5] ma

我正在使用
库生成一个
值,但使用简单函数转换流时遇到问题

有人能给我指一下正确的方向吗

#!/usr/bin/env stack

import Streaming
import qualified Streaming.Prelude as S
import Data.Maybe

stream :: Stream (Of (Maybe Integer)) Maybe ()
stream = S.each [Just 1, Just 2, Just 3, Just 4, Just 5]

main :: IO ()
main = do
  print $ S.mapM (\x -> isJust x) stream
  print "done"
这就是我得到的错误:

test.hs:13:25: error:
    • Couldn't match expected type ‘Maybe b0’ with actual type ‘Bool’
    • In the expression: isJust x
      In the first argument of ‘S.mapM’, namely ‘(\ x -> isJust x)’
      In the second argument of ‘($)’, namely
        ‘S.mapM (\ x -> isJust x) stream’
   |
13 |   print $ S.mapM (\x -> isJust x) stream
   |                         ^^^^^^^^

Streaming.Prelude.mapM
具有类型

Monad m => (a -> m b) -> Stream (Of a) m r -> Stream (Of b) m
这就是为什么typechecker希望函数的返回类型是
可能是b0

你需要的是

Streaming.Prelude.map :: Monad m => (a -> b) -> Stream (Of a) m r -> Stream (Of b) m r
或者干脆

fmap :: Functor f => (a -> b) -> f a -> f b

请记住,
\x->isJust x
相当于简单地编写
isJust