在编写自定义地图功能讨论了我当前的问题后,我想我找到了解决问题的方法:
mapLift :: Monad m => (a -> b) -> [m a] -> [m b]
mapLift f = map (liftM f)
但是,当我使用它时,会出现编译器错误。我的实际代码是:
actuals = zipWith mapLift (mapLift eval wffs) assignments
在哪里
eval :: Wff -> Assignment -> Maybe Bool
wffs :: [Either String Wff]
assignments :: [Assignment]
此代码给出以下错误消息:
Couldn't match expected type `a0 -> Wff' with actual type `Either String Wff' Expected type: [a0 -> Wff] Actual type: [Either String Wff] In the second argument of `mapLift', namely `wffs' In the second argument of `zipWith', namely `(mapLift eval wffs)'
我究竟做错了什么?我想在保留任何 s 的同时eval
进行映射,这些s 会在过程中的上一步给出错误消息。wffs
Left
编辑:
本来,我的想法是这样的actuals :: [Either String (Maybe Bool)]
。但是,我正在考虑修改eval
为eval :: Wff -> Assignment -> Either String Bool
,以便actuals :: [Either String Bool]
.
更新:
我在原来的问题中打错了字。assignments
应该:
assignments :: [[Assignment]]