我有这个模拟:
init : (Model, Cmd Msg)
init = ({ dog = List Dog }, Cmd.none)
type alias Dog =
{ name : String
, age : Int
, price : Float
, extra = List Extra
}
type alias Extra =
{ allergies : List String
, wishes : List String
}
[{ name = "Hot"
, age = 1
, price = 300.5
, extra = [{...}]
},
{ name = "Dog"
, age = 3
, price = 150.0
, extra = [{...}]
}]
我想在代码的确定部分中仅删除Dog的'extras':
[{ name = "Hot"
, age = 1
, price = 300.5
},
{ name = "Dog"
, age = 3
, price = 150.0
}]
我可以通过映射整个列表并通过删除“额外”发生来生成新列表来完成此操作:
removeExtraOfDogs dogList =
(dogList |> List.map (\dog ->
{ name = dog.name
, age = dog.age
, price = dog.price
}
))
但是我想让它变得动态,只需传递额外的东西就可以删除,而不必知道类型中有哪些变量并重新创建它
答案 0 :(得分:4)
Elm曾经拥有此功能但it was removed a while ago。但是,根据评论中描述的用例,我认为您不需要此功能。您可以改为使用Elm的可扩展记录功能,只要它们包含一组固定的字段,就可以将不同的记录传递给函数。
例如,假设您有两种类型的name
和age
字段,并且有一个额外的不兼容字段:
type alias Foo = { name : String, age : Int, extra : List String }
type alias Bar = { name : String, age : Int, extra : Int }
您可以定义一个记录,其中包含name
字段String
和age
类型Int
以及任何额外字段的记录:
encode : { r | name : String, age : Int } -> String
encode record = record.name ++ "," ++ toString record.age
您现在可以将Foo
和Bar
都传递给此函数,因为它们都满足类型签名的要求。