如何在 Elm 中创建 Maybe 记录而不是 Maybes 记录

How to create a Maybe record instead of a record of Maybes in Elm

这可能是一件简单的事情,但我正在编写一个函数,我想 return 一条记录,并且有几个字段需要做一些可能会失败的事情,所以现在结果记录看起来像这样(假设它的类型别名为 MyRecord)。

{ field1 : Maybe a
, field2 : Maybe a
, field3 : Maybe a
}

然而,这并不能准确代表所发生事情的 "real" 含义。该函数的基本目标是验证和重新格式化某些数据。所以我想说,如果我有一个 MyRecord,我就有三个价值 a 的字段。如果我没有这些字段,我想知道我没有 MyRecord。那么,从逻辑上讲,我想 return 一个 Maybe MyRecord,但对于我来说,这是在逃避我的 newish-to-elm 能力。

目前,我正在一次创建所有记录,但由于显而易见的原因,这不起作用:

{ field1 = maybeProducingFunction1
, field2 = maybeProducingFunction2
, field3 = maybeProducingFunction3
}

如何创建此记录,以便如果这些函数中的任何一个生成 Nothing,则整个记录是 Nothing

如果我理解正确的话,你想要的是定义一个类型

type alias MyRecord =
  { field1 : Maybe a
  , field2 : Maybe a
  , field3 : Maybe a
  }

只有三个组成数据都具备了才创建记录?方法是使用 Maybe.map3:

myResult = 
  Maybe.map3 MyRecord
    maybeProducingFunction1
    maybeProducingFunction2
    maybeProducingFunction3

这将为您完成所有 Maybe 检查,并且仅当它们都具有 Just 值时才构建您的记录。

您还可以使用与 Result 类似的方法,其优点是您可以传递有关哪个函数失败的信息(严格来说,这是第一个失败的函数)。