2017-12-16 24 views
1

나는이 시뮬레이션이 :모든 항목을 모른 채 기록의 항목을 제거

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 = [{...}] 
    }] 

을 그리고 코드의 판단 부분에서 개의 '엑스트라'를 제거하려면 :

[{ name = "Hot" 
, age = 1 
, price = 300.5 
}, 
{ name = "Dog" 
, age = 3 
, price = 150.0 
}] 

I '추가'항목을 제거하여 전체 목록을 매핑하고 새 항목을 생성하면됩니다.

removeExtraOfDogs dogList = 
    (dogList |> List.map (\dog -> 
      { name = dog.name 
      , age = dog.age 
      , price = dog.price 
      } 
     )) 

하지만 유형에 어떤 변수가 있는지 알지 않고도 제거 할 여분을 전달하는 것이 동적입니다.

+0

왜 필드를 삭제하려고합니까? 왜 '{name, age, price}'를 가진 새로운 타입의 별칭을 만드는 것이 좋을까요? – naomik

+0

@naomik, 왜냐하면 내가 개발하고있는 프로젝트에서, 레코드의 1 또는 2 항목을 취하는 것과 동일한 작업을 수행해야하는 +50 유형이 있기 때문입니다. 이유 : .csv 형식으로 내보낼 필요가 있으며 '추가'가 필요하지 않습니다. –

+1

나는 Elm에서 Json 인코딩/디코딩을 읽는 것이 좋습니다. Csv를 인코딩 할 때도 동일한 규칙이 적용됩니다. 더 자세한 검색 결과를 찾을 수 있기 때문에 Json에 대한 정보 만 읽으십시오. – naomik

답변

4

느릅 나무에이 ​​기능이 있지만 이전에는 it was removed a while ago이었습니다. 그러나 주석에 설명 된 유스 케이스를 기반으로이 기능이 필요하다고 생각하지 않습니다. 대신 Elm의 확장 가능한 레코드 기능을 사용하여 고정 된 필드 집합을 포함하는 한 다른 레코드를 함수에 전달할 수 있습니다.

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

당신은 유형 Stringagename 필드 레코드를받는 함수를 정의 할 수 있습니다 : 예를 들어

,의 당신이 nameage 필드 두 가지 유형이 있고 별도의 호환되지 않는 필드를 가진 가정 해 봅시다 유형 Int 및 추가 필드의 :

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

은 이제 통과 할 수 있습니다 모두 FooBar은 형식 서명의 요구 사항을 모두 충족하므로이 함수에 추가해야합니다.

+0

성능상의 이유로 나는 모든 시스템에서이 유형을 한 번만 사용해야하기 때문에 고풍 모드에있게 될 것이다. –