Ошибки компиляции MaybeT

Ошибка:

maybet.hs:8:14:
    Couldn't match expected type `MaybeT m0 t0'
                with actual type `Maybe a0'
    In the return type of a call of `M.lookup'
    In a stmt of a 'do' expression: m <- M.lookup "a" a
    In the second argument of `($)', namely
      `do { m <- M.lookup "a" a;
              lift $ putStrLn m }'

И код:

import qualified Data.Map as M
import Control.Monad.Trans.Maybe
import Control.Monad.Trans.Class

main = do
    let a = M.fromList [("a", "b"), ("c", "d")]
    runMaybeT $ do
        m <- M.lookup "a" a
        lift $ putStrLn m
    putStrLn "done"

Если кто-нибудь может помочь мне с преобразователем MaybeT, я был бы признателен. Я не могу понять, как заставить это работать.


person Kevin    schedule 05.01.2013    source источник
comment
возможный дубликат Как внедрить значение Maybe в MaybeT   -  person Satvik    schedule 05.01.2013


Ответы (1)


В этом маленьком примере нет никакой выгоды от использования MaybeT: вы можете написать три строки, используя MaybeT, как:

Data.Foldable.traverse_  putStrLn $ M.lookup "a" a

Нет автоматического преобразования Maybe в MaybeT (хотя оно могло бы быть, если бы Maybe было фактически определено как MaybeT Identity), поэтому вам нужно применить функцию к результату M.lookup, например:

(MaybeT . return) :: Maybe a -> MaybeT m a
person aavogt    schedule 05.01.2013
comment
Я не понимаю, почему применение (MaybeT . return) к значению работает, но это решает мою проблему. Спасибо. - person Kevin; 05.01.2013