在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.除非有更好的方式来表示这一点,在这种情况下我是所有的耳朵! : - )
答案 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
(或Array
)InnerType
,正如您所说,结构本身固定为其中的12个。至于迭代,这里是json编码InnerType
inners
|> List.indexedMap (\idx inner -> ("inner" ++ toString idx, encodeInner inner))
|> Json.Encode.object