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 个。除非有更好的方法来表示这一点,在这种情况下我全神贯注!:-)
如果您的记录只有十二个元素,并且您不介意在类型定义中为类型安全牺牲一点冗长(使不可能的状态成为不可能!),您可以从枚举这十二个索引开始:
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 类型会被很好地密封起来,但代价是定义有点冗长。