>source

여러 컨테이너를 가질 수 있는 앱과 여러 앱을 가질 수 있는 컨테이너가 있는 앱 및 컨테이너의 구성이 제공됩니다. 2가지 방법으로 출력하고 싶습니다.

  • 앱 목록별 컨테이너
  • 컨테이너별 앱 목록

데이터 형식은 간단하지만 관계를 반복하지 않고 이 두 표현을 모두 얻을 수 있는 방법을 찾지 못하는 것 같습니다.

앱이 있는 컨테이너에서 시작할 때 데이터의 예

let app1= { name= "app1" }
let app2= { name= "app2" }
let containers= [
  { name= "container1", apps= [ app1 ] },
  { name= "container2", apps= [ app1, app2 ] }
]
{-I can easily transform this data to the following -}
[
  { app= "app1", container= "container1" },
  { app= "app1", container= "container2" },
  { app= "app2", container= "container2" }
]
{-But I cannot seem to get it into the requested format -}
[
  "app1"= [ "container1", "container2" ]
  "app2"= [ "container2" ]
]

식별자를 다음과 같이 사용하는 것 같습니다.텍스트동일한 식별자를 사용하여 연결된 목록 또는 이와 유사한 것을 병합할 방법이 없기 때문에 작동할 수 없습니다.

레code를 사용하여 다음과 같이 병합할 수 있습니다.{a1= {c1= True}} /\ {a1= {c2= True}} /\ {a2= {c2= True}}. 어느 것이 될 것인가{a1= {c1= 참, c2= 참}, a2= {c2= 참}}. 그러나 나는 기록을 '역전'할 수 없기 때문에 애초부터 이 상태에 도달할 수 없다.

관계를 두 번 반복할 필요가 없는 한 구성을 어떻게 구성해야 하는지 상관하지 않습니다.

  • 답변 # 1

    예, 언어가 허용하지 않기 때문에 요청한 것을 정확히 수행할 수 없습니다.텍스트비교

    내가 생각할 수 있는 가장 가까운 해결책은 다음과 같습니다.

    let Map= https://prelude.dhall-lang.org/v21.1.0/Map/Type.dhall
    let List/concatMap= https://prelude.dhall-lang.org/v21.1.0/List/concatMap.dhall
    let List/map= https://prelude.dhall-lang.org/v21.1.0/List/map.dhall
    let startingMapping
        : Map Text (Map Text {})
      = toMap
            { container1= toMap { app1= {=} }
            , container2= toMap { app1= {=}, app2= {=} }
            }
    let desiredMapping
        : Map Text (Map Text {})
      = toMap
            { app1= toMap { container1= {=}, container2= {=} }
            , app2= toMap { container2= {=} }
            }
    let transpose
        : ∀(a : Type) → Map Text (Map Text a) → Map Text (Map Text a)
      = λ(a : Type) →
            List/concatMap
              { mapKey : Text, mapValue : Map Text a }
              { mapKey : Text, mapValue : Map Text a }
              ( λ(x : { mapKey : Text, mapValue : Map Text a }) →
                  List/map
                    { mapKey : Text, mapValue : a }
                    { mapKey : Text, mapValue : Map Text a }
                    ( λ(y : { mapKey : Text, mapValue : a }) →
                        { mapKey= y.mapKey
                        , mapValue=
                          [ { mapKey= x.mapKey, mapValue= y.mapValue } ]
                        }
                    )
                    x.mapValue
              )
    in  assert : transpose {} startingMapping ≡ desiredMapping
    

    어설션은 다음 오류 메시지와 함께 실패합니다.

    Error: Assertion failed
    [ -{ mapKey= "app1"
        , mapValue= [ { mapKey= "container1", mapValue= {=} } ]
        }
    , -{ mapKey= "app1"
        , mapValue= [ { mapKey= "container2", mapValue= {=} } ]
        }
    , + { mapKey= "app1"
        , mapValue=
          [ { mapKey= "container1", mapValue= {=} }
          , { mapKey= "container2", mapValue= {=} }
          ]
        }
    , …
    ]
    41│     assert : transpose {} startingMapping ≡ desiredMapping
    

    … 결과가 두 개의 중복을 통합하지 않기 때문에앱1당신이 요청한 것과 같은 키.

    레code를 맵으로 변환한 다음 구조를 되돌린 다음 맵으로 다시 변환한 다음 병합하여 이것이 가능할까요? Map을 구조체로 변환할 수 있습니까? 이 변환의 유형은 초기 레code 데이터의 유형이 있기 때문에 알 수 있습니다.

    alazeo2022-01-18 02:51:16
  • 이전 python : 수렴 순서 Runge-Kutta는 시간에 따라 변합니다.
  • 다음 android : TextInputEditText에서 쉼표 비활성화