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