Список Ассоциации Далла - PullRequest
1 голос
/ 29 марта 2019

У меня есть тип Union, для которого я хочу, чтобы одно поле было списком ассоциаций.

let Blah = < First : { name : Text, params: XXX } | Second : { name : Text } >

Здесь я хочу, чтобы params был списком ассоциаций, поэтому при вводе проверки значений Record он будет проходитьНапример,

Blah.First { name = "Alex", params: [{ mapKey = "a", mapValue = 1 }] }

Итак, какой тип должен XXX быть в Blah?

1 Ответ

1 голос
/ 30 марта 2019

Ответ зависит от типа значения, хранящегося в списке ассоциаций. В наиболее общем случае вы можете параметризовать тип Blah для типа mapValue, например:

let Blah =
        λ(a : Type)
      → < First :
            { name : Text, params : List { mapKey : Text, mapValue : a } }
        | Second :
            { name : Text }
        >

in  (Blah Natural).First
    { name = "Alex", params = [ { mapKey = "a", mapValue = 1 } ] }

Если вы заранее знаете нужный тип mapValue, вы можете жестко закодировать его вместо того, чтобы Blah быть функцией типа. Или, если вы планируете использовать Blah для одного и того же типа mapValue несколько раз, вы можете сделать что-то вроде этого:

let Blah =
        λ(a : Type)
      → < First :
            { name : Text, params : List { mapKey : Text, mapValue : a } }
        | Second :
            { name : Text }
        >

let Foo = Blah Natural

in  [ Foo.First { name = "Alex", params = [ { mapKey = "a", mapValue = 1 } ] }
    , Foo.Second { name = "John" }
    ]
...