我有这个模拟:
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
}]
我可以通过映射整个列表并通过删除'extra'出现来生成一个新列表:
removeExtraOfDogs dogList =
(dogList |> List.map (\dog ->
{ name = dog.name
, age = dog.age
, price = dog.price
}
))
但我想让它动态,只需传递额外的删除,而不必知道类型中有哪些变量并重新创建它
榆树过去有这个功能,但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
传递给此函数,因为它们都满足类型签名的要求。