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

M-N*_*M-N 2 record elm

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

{ field1 : Maybe a
, field2 : Maybe a
, field3 : Maybe a
}
Run Code Online (Sandbox Code Playgroud)

然而,这并不能准确地代表所发生事情的“真实”含义。该函数的基本目标是验证和重新格式化一些数据。所以我想说,如果我有一个MyRecord,我有三个字段值得a's。如果我没有这些字段,我想知道我没有MyRecord. 从逻辑上讲,我想返回一个Maybe MyRecord,但对于我的一生,这是逃避我的新手到榆树的能力。

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

{ field1 = maybeProducingFunction1
, field2 = maybeProducingFunction2
, field3 = maybeProducingFunction3
}
Run Code Online (Sandbox Code Playgroud)

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

Sim*_*n H 5

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

type alias MyRecord =
  { field1 : Maybe a
  , field2 : Maybe a
  , field3 : Maybe a
  }
Run Code Online (Sandbox Code Playgroud)

并且仅当您拥有所有三个组成数据时才创建记录?这样做的方法是使用 Maybe.map3:

myResult = 
  Maybe.map3 MyRecord
    maybeProducingFunction1
    maybeProducingFunction2
    maybeProducingFunction3
Run Code Online (Sandbox Code Playgroud)

这将为您执行所有可能的检查,并且仅在它们都有Just值时才构建您的记录。

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