道尔协会名单

时间:2019-03-29 11:05:31

标签: dhall

我有一个Union类型,希望一个字段成为关联列表。

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

在这里,我希望params是一个关联列表,所以当我键入check Record值时,它将通过,例如

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

那么XXX中应该Blah是什么类型?

1 个答案:

答案 0 :(得分:1)

答案取决于关联列表中存储的值的类型。在最一般的情况下,您可以将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" }
    ]