我声明了以下类型:
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)
感谢您的帮助。
答案 0 :(得分:1)
您的case
表达式具有不同类型的分支。
fail
的类型为Monad m => String -> m a
(因此fail err
的类型为Monad m => m a
),而pr
是Property
。
这就是m a
与Property
不匹配的原因。
如果您希望它们匹配,则需要将Property
和m 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