遍历记录字段

Jen*_*olm 1 iteration record elm

在 Elm 中,我的一个记录(type alias构造)有很多条目,我想知道是否有内置的方法来遍历它。直接或通过将其转换为Dict

所以我在想:

let
  myRecord = MyRecord ...
  showEntry key value = ...
in
  map showEntry myRecord
Run Code Online (Sandbox Code Playgroud)

谢谢你的时间!

更新

为了回答有关实际数据的问题,我有 12 个相同类型的字段。这 12 个字段都需要具有该确切名称,因此是记录类型而不是Dict. 无论它是作为记录中的字符串命名还是本身的类型都无关紧要,只要我可以从其他 11 个值中唯一标识该值。在代码中,记录看起来像:

type alias InnerType { value : Int, ... }

type alias Record = { inner1 : InnerType, inner2 : InnerType, ... }
Run Code Online (Sandbox Code Playgroud)

由于记录中的所有字段都具有相同的类型,我只是想看看是否有更简单的方法来遍历它们而不是命名所有 12 个。除非有更好的方法来表示这一点,在这种情况下我全神贯注!:-)

Cha*_*ert 5

如果您的记录只有十二个元素,并且您不介意在类型定义中为类型安全牺牲一点冗长(使不可能的状态成为不可能!),您可以从枚举这十二个索引开始:

type Index
    = Inner1
    | Inner2
    ...
    | Inner12
Run Code Online (Sandbox Code Playgroud)

您可以重新定义Record为 atype而不是记录类型别名:

type Record =
    Record
        InnerType
        InnerType
        -- repeat InnerType 12 times
Run Code Online (Sandbox Code Playgroud)

现在您可以创建一些方便的函数来以类型安全的方式获取和设置值:

get : Index -> Record -> InnerType
get i (Record i1 i2 i3 i4 i5 i6 i7 i8 i9 i10 i11 i12) =
    case i of
        Inner1 -> i1
        Inner2 -> i2
        ...
        Inner12 -> i12

set : Index -> InnerType -> Record -> Record
set i val (Record i1 i2 i3 i4 i5 i6 i7 i8 i9 i10 i11 i12) =
    case i of
        Inner1 -> Record val i2 i3 i4 i5 i6 i7 i8 i9 i10 i11 i12
        Inner2 -> Record i1 val i3 i4 i5 i6 i7 i8 i9 i10 i11 i12
        ...
        Inner12 -> Record i1 i2 i3 i4 i5 i6 i7 i8 i9 i10 i11 val
Run Code Online (Sandbox Code Playgroud)

您可以从您的记录中创建一个列表,如下所示:

toList : Record -> List InnerType
toList (Record i1 i2 i3 i4 i5 i6 i7 i8 i9 i10 i11 i12) =
    [ i1, i2, i3, i4, i5, i6, i7, i8, i9, i10, i11, i12 ]
Run Code Online (Sandbox Code Playgroud)

如您所见,这变得冗长,但只有在 Record 类型的定义中,它才会变得冗长。如果您将所有这些代码限制在一个Record模块中,那么访问和修改记录就会干净、简洁,更重要的是,类型安全。您不受可能不存在键的字典或可能不存在索引的列表或数组的约束。你的 Record 类型会被很好地密封起来,但代价是定义有点冗长。

这是包含完整定义的要点