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
具有type
TypeA->TypeB
并且不能调用错误情况。也许你要记住类型
TypeA->ExceptT Error m TypeB
transverse
在列表上被正式称为
mapM
,是地图的一元版本。(但这是古老的词汇,因为
是可遍历的
[A]
ExceptT Error [B]