在不知道所有项目的情况下删除记录项

时间:2017-12-16 01:21:44

标签: elm

我有这个模拟:

 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
          }
        )) 

但是我想让它变得动态,只需传递额外的东西就可以删除,而不必知道类型中有哪些变量并重新创建它

1 个答案:

答案 0 :(得分:4)

Elm曾经拥有此功能但it was removed a while ago。但是,根据评论中描述的用例,我认为您不需要此功能。您可以改为使用Elm的可扩展记录功能,只要它们包含一组固定的字段,就可以将不同的记录传递给函数。

例如,假设您有两种类型的nameage字段,并且有一个额外的不兼容字段:

type alias Foo = { name : String, age : Int, extra : List String }
type alias Bar = { name : String, age : Int, extra : Int }

您可以定义一个记录,其中包含name字段Stringage类型Int以及任何额外字段的记录:

encode : { r | name : String, age : Int } -> String
encode record = record.name ++ "," ++ toString record.age

您现在可以将FooBar都传递给此函数,因为它们都满足类型签名的要求。