Не понимаю это поведение liftM2 в Fay

У меня есть этот код haskell, который ведет себя как ожидалось:

import Control.Monad

getVal1 :: Maybe String
getVal1 = Just "hello"

getVal2 :: Maybe String
getVal2 = Just "World"

main = process >>= putStrLn

process :: IO String
process = case liftM2 operation getVal1 getVal2 of
    Nothing -> error "can't run operation, one of the params is Nothing"
    Just result -> result

operation :: String -> String -> IO String
operation a b = return $ a ++ b

Однако при переносе в Fay проверка не выполняется:

{-# LANGUAGE NoImplicitPrelude, EmptyDataDecls #-}

import Prelude
import FFI

liftM2 f m1 m2 = do { x1 <- m1; x2 <- m2; return (f x1 x2) }

getVal1 :: Maybe String
getVal1 = Just "hello"

getVal2 :: Maybe String
getVal2 = Just "World"

main = process >>= putStrLn

process :: Fay String
process = case liftM2 operation getVal1 getVal2 of
    Nothing -> error "can't run operation, one of the params is Nothing"
    Just result -> result

operation :: String -> String -> Fay String
operation a b = return $ a ++ b

Ошибка компиляции:

fay: ghc: 
TestFay.hs:17:33:
    Couldn't match expected type `Fay String'
                with actual type `Maybe String'
    In the second argument of `liftM2', namely `getVal1'
    In the expression: liftM2 operation getVal1 getVal2
    In the expression:
      case liftM2 operation getVal1 getVal2 of {
        Nothing
          -> error "can't run operation, one of the params is Nothing"

Я не совсем понимаю проблему здесь. На самом деле я даже пытался удалить импорт для Control.Monad в коде GHC и вставить liftM2, как в коде Fay, но он все еще проверяет правильность типов... Любой вариант использования таких функций, как liftMx в Fay, или я пропускаю что-то полностью здесь?

Это Фэй 0.16.0.3... Может мне стоит попробовать обновить до 0.17?

1 ответ

Решение

Я подозреваю что do нотация в Fay работает на Fay только монада, потому что AFAIK Fay не поддерживает классы типов. Глядя на Прелюдию Фэй, я вижу, что (>>=) а также return мономорфны, специализированы на Fay монада.

Другие вопросы по тегам