Как применить функцию к значениям в потоке, созданном потоковой библиотекой - PullRequest
0 голосов
/ 14 мая 2018

Я создаю поток значений Just с использованием библиотеки 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]

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
   |                         ^^^^^^^^

1 Ответ

0 голосов
/ 14 мая 2018

Streaming.Prelude.mapM имеет тип

Monad m => (a -> m b) -> Stream (Of a) m r -> Stream (Of b) m

, поэтому проверщик типов ожидает, что тип возвращаемого значения функции будет Maybe 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...