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

Haskell 如何在dhall中使用多态类型构造函数,haskell,dhall,Haskell,Dhall,我试图在Dhall中定义一个多态类型。在Haskell中,它看起来像: data MyType a = Some a | SomethingElse 为此,我在Dhall(mkMyType.Dhall)中定义了此函数: 现在,为了使用它,我需要做如下操作: (./mkMyTypeConstructor.dhall Text).some "foo" 这样做对吗 最后,在我的用例中最理想的是一种类型,它可以对文本(例如“foo”)和自定义类型(例如{somethingElse:{})进行类型检查

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

data MyType a = Some a | SomethingElse
为此,我在Dhall(mkMyType.Dhall)中定义了此函数:

现在,为了使用它,我需要做如下操作:

(./mkMyTypeConstructor.dhall Text).some "foo"
这样做对吗


最后,在我的用例中最理想的是一种类型,它可以对文本(例如“foo”)和自定义类型(例如{somethingElse:{})进行类型检查。这可能吗

我将使用类似于Haskell的
的联合类型来保持以下示例的自包含性

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

-- Either.dhall
λ(a : Type) → λ(b : Type) → < Left : a | Right : b >
。。。然后我们可以像这样使用该文件:

-- makeEither.dhall
λ(a : Type) → λ(b : Type) → constructors (./Either.dhall a b)
[ (./makeEither.dhall Text Natural).Left "Foo"
, (./makeEither.dhall Text Natural).Right 1
]
    let either = ./makeEither.dhall Text Natural

in  [ either.Left "Foo", either.Right 1 ]
。。。但这不符合人体工程学

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

-- makeEither.dhall
λ(a : Type) → λ(b : Type) → constructors (./Either.dhall a b)
[ (./makeEither.dhall Text Natural).Left "Foo"
, (./makeEither.dhall Text Natural).Right 1
]
    let either = ./makeEither.dhall Text Natural

in  [ either.Left "Foo", either.Right 1 ]
另外,请注意,我们可以在大约相同的空间量中直接使用
构造函数
任一.dhall

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

in  [ either.Left "Foo", either.Right 1 ]
。。。这意味着我们不再需要中间
makeother.dhall
文件

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

  • 使用
    let
    表达式以避免重复使用
    构造函数
    关键字
  • 让最终用户自己调用构造函数,而不是为他们这样做
关于你的后一个问题,我认为应该放在一个单独的问题中

编辑:请注意,
构造函数
关键字现在已经过时,您现在只需编写:

let either = ./Either.dhall Text Natural

in  [ either.Left "Foo", either.Right 1 ]
有关详细信息,请参阅:


至少在这种情况下,您的类型重新实现了可选a
;工会是没有必要的。