从任一返回定义的类型

时间:2018-09-19 01:18:53

标签: haskell

我声明了以下类型:

data Property = Property {mapProperty :: !Object
                      } deriving (Show, Generic)

我要从以下函数返回该类型:

parseProps :: String -> IO (Either String Property)
parseProps m = fmap property <$> (eitherDecode <$> getMap m)

在调用函数中,我具有以下内容:

pr <- liftIO $ parseProps t
let pro = case pr of
        Left err -> fail err
        Right pr -> pr

我从上面的行(正确pr-> pr)中得到以下错误:

无法将预期类型“ m a”与实际类型“属性”匹配 •在表达式中:pr   另一种情况是:右pr-> pr   在表达式中:

    case pr of {
      Left err -> fail err
      Right pr -> pr }

•相关绑定包括     pro :: m a(绑定到src / Actor / Master.hs:42:7)

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

您的case表达式具有不同类型的分支。 fail的类型为Monad m => String -> m a(因此fail err的类型为Monad m => m a),而prProperty

这就是m aProperty不匹配的原因。

如果您希望它们匹配,则需要将Propertym Property转换为return

像这样:

pr <- liftIO $ parseProps t
pro <- case pr of
    Left err -> fail err
    Right pr -> return pr
...

然后用pro

而且,正如乔恩·普迪(Jon Purdy)和保罗·约翰逊(Paul Johnson)在评论中指出的那样,此操作有一个组合器,称为either。因此,这是一种更简洁的书写方式:

pr <- liftIO $ parseProps t
pro <- either fail return pr