如何在dhall中使用多态类型构造函数

时间:2018-07-30 19:18:10

标签: haskell dhall

我正在尝试在Dhall中定义一个多态类型。在Haskell中,它看起来像:

using

为此,我已在Dhall(mkMyType.dhall)中定义了此函数:

data MyType a = Some a | SomethingElse

我还定义了一个函数,该函数返回给定类型(./mkMyTypeConstructor.dhall)的该类型的构造函数:

let SomethingElse = ./SomethingElse.dhall  in λ(a : Type) → < some : a | somethingElse : SomethingElse >

现在,要使用它,我需要做类似的事情:

λ(a : Type) → constructors (./mkMyType.dhall a)

这是正确的方法吗?

最后,在我的用例中最理想的类型将是同时检查诸如“ foo”之类的Text和自定义类型(例如{somethingElse:{}})的类型。这可能吗?

1 个答案:

答案 0 :(得分:3)

我将使用类似于Haskell的Either的联合类型来使以下示例保持独立。

假设我们保存以下Either.dhall文件:

-- Either.dhall
λ(a : Type) → λ(b : Type) → < Left : a | Right : b >

我们*可以提供一个makeEither.dhall文件,如下所示:

-- makeEither.dhall
λ(a : Type) → λ(b : Type) → constructors (./Either.dhall a b)

...然后我们可以像这样使用该文件:

[ (./makeEither.dhall Text Natural).Left "Foo"
, (./makeEither.dhall Text Natural).Right 1
]

...但是那不是人体工程学的。

例如,不必重复编写./makeEither.dhall Text Natural,因为我们可以使用let表达式来减少重复,如下所示:

    let either = ./makeEither.dhall Text Natural

in  [ either.Left "Foo", either.Right 1 ]

另外,请注意,我们可以在大约相同的空间中直接使用constructorsEither.dhall

    let either = constructors (./Either.dhall Text Natural)

in  [ either.Left "Foo", either.Right 1 ]

...这意味着我们不再需要中间的makeEither.dhall文件。

最后一个例子是我推荐的方法。具体来说:

  • 使用let表达式来避免重复使用constructors关键字
  • 让最终用户自己打constructors,而不是自己打

对于您的后一个问题,我认为应该在单独的StackOverflow问题中进行。