Haskell 从列表中选择一个
假设我有以下解析器函数:Haskell 从列表中选择一个,haskell,exception,Haskell,Exception,假设我有以下解析器函数: validateA :: MyMonad m => TypeA -> TypeB validateA a = (fmapLT Service $ getB $ bId a) >>= \bResult -> case bResult of Nothing -> throwError $ Validation InvalidBId Just actualB -> return $ B actualB 其中get
validateA :: MyMonad m => TypeA -> TypeB
validateA a = (fmapLT Service $ getB $ bId a) >>= \bResult ->
case bResult of
Nothing -> throwError $ Validation InvalidBId
Just actualB -> return $ B actualB
其中getB
向另一个服务发出http请求
我希望将其映射到一个数组中,如下所示:
validateAs
:: MyMonad m
=> [TypeA]
-> ExceptT Error m [TypeB]
validateAs as = map validateA as
无法通过以下方式编译:
• Couldn't match type ‘[]’ with ‘ExceptT Error m’
Expected type: ExceptT Error m [TypeB]
Actual type: [ExceptT Error m0 TypeB]
• In the expression: map validateA as
In an equation for ‘validateAs’:
validateAs as = map validateA as
• Relevant bindings include
validateAs :: [TypeA]
-> ExceptT Error m [TypeB]
(bound at lib/Flock/Policies/Core/Domain/CancelPolicyV2/Validation.hs:89:1)
|
89 | validateAs as = map validateAs as
我如何映射一个列表,其中每个调用都可能失败,但随后按照我的意愿将异常清除
基本上我该如何从:
v :: m => A -> ExceptT Error B
及
到
map
具有类型(a->b)->[a]->[b]
,因此您得到的是[ExceptT Error m0 TypeB]
而不是ExceptT Error m[TypeB]
。您可以对结果应用sequenceA
:
validateSchedules as=sequenceA$map validateA as
您还可以使用函数遍历
:
validateSchedules as=遍历validateA as
但是您的函数validateA
具有typeTypeA->TypeB
并且不能调用错误情况。也许你要记住类型TypeA->ExceptT Error m TypeB
?transverse
在列表上被正式称为mapM
,是地图的一元版本。(但这是古老的词汇,因为是可遍历的
)
[A]
ExceptT Error [B]