迭代记录字段

时间:2017-06-29 17:57:38

标签: iteration record elm

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

所以我想的是:

let
  myRecord = MyRecord ...
  showEntry key value = ...
in
  map showEntry myRecord

谢谢你的时间!

更新

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

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

type alias Record = { inner1 : InnerType, inner2 : InnerType, ... }

由于记录中的所有字段都具有相同的类型,我只是想看看是否有更简单的方法来通过它们而不是命名所有12.除非有更好的方式来表示这一点,在这种情况下我是所有的耳朵! : - )

2 个答案:

答案 0 :(得分:3)

如果您的记录有<12个元素并且您不介意在类型定义中为类型安全(make impossible states impossible!)牺牲一点点详细程度,则可以从枚举开始那十二个指数:

LRU

您可以将type Index = Inner1 | Inner2 ... | Inner12 重新定义为Record而不是记录类型别名:

type

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

type Record =
    Record
        InnerType
        InnerType
        -- repeat InnerType 12 times

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

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

正如您所看到的,这会变得冗长,但只有在Record类型的定义中才会变得冗长。如果将所有这些代码限制在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 ] 模块中,则访问和修改记录是干净,简洁的,更重要的是,类型安全。您不受可能不存在密钥的Dictionary或可能不存在索引的List或Array的约束。您的记录类型将被密封得很好而且紧凑,代价是定义中有点冗长。

Here is a gist包含完整定义。

答案 1 :(得分:2)

您似乎需要List(或ArrayInnerType,正如您所说,结构本身固定为其中的12个。至于迭代,这里是json编码InnerType

列表的示例
inners 
  |> List.indexedMap (\idx inner -> ("inner" ++ toString idx, encodeInner inner))
  |> Json.Encode.object