如何在 dhall 中使用多态类型构造函数
How to use polymorphic type constructors in dhall
我正在尝试在 Dhall 中定义多态类型。在 Haskell 中它看起来像:
data MyType a = Some a | SomethingElse
为此,我在 Dhall (mkMyType.dhall) 中定义了这个函数:
let SomethingElse = ./SomethingElse.dhall in λ(a : Type) → < some : a | somethingElse : SomethingElse >
我还定义了一个函数,returns 该类型的构造函数,给定一个 (./mkMyTypeConstructor.dhall):
λ(a : Type) → constructors (./mkMyType.dhall a)
现在,为了使用它,我需要做一些类似的事情:
(./mkMyTypeConstructor.dhall Text).some "foo"
这样做正确吗?
最后,在我的用例中最理想的是一种类型,它可以针对 "foo" 等文本和自定义类型进行类型检查,例如 { somethingElse: {} }.这可能吗?
我将使用类似于 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 ]
此外,请注意,我们可以直接使用 constructors
和 Either.dhall
,而 space:
let either = constructors (./Either.dhall Text Natural)
in [ either.Left "Foo", either.Right 1 ]
... 这意味着我们不再需要中间 makeEither.dhall
文件。
最后一个例子是我推荐的方法。具体来说:
- 使用
let
表达式避免重复使用 constructors
关键字
- 让最终用户自己打电话给
constructors
,而不是替他们打电话
对于你的后一个问题,我认为应该放在一个单独的 Whosebug 问题中。
编辑: 请注意,constructors
关键字现在已过时,您现在可以只写:
let either = ./Either.dhall Text Natural
in [ either.Left "Foo", either.Right 1 ]
更多详情,请参阅:
我正在尝试在 Dhall 中定义多态类型。在 Haskell 中它看起来像:
data MyType a = Some a | SomethingElse
为此,我在 Dhall (mkMyType.dhall) 中定义了这个函数:
let SomethingElse = ./SomethingElse.dhall in λ(a : Type) → < some : a | somethingElse : SomethingElse >
我还定义了一个函数,returns 该类型的构造函数,给定一个 (./mkMyTypeConstructor.dhall):
λ(a : Type) → constructors (./mkMyType.dhall a)
现在,为了使用它,我需要做一些类似的事情:
(./mkMyTypeConstructor.dhall Text).some "foo"
这样做正确吗?
最后,在我的用例中最理想的是一种类型,它可以针对 "foo" 等文本和自定义类型进行类型检查,例如 { somethingElse: {} }.这可能吗?
我将使用类似于 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 ]
此外,请注意,我们可以直接使用 constructors
和 Either.dhall
,而 space:
let either = constructors (./Either.dhall Text Natural)
in [ either.Left "Foo", either.Right 1 ]
... 这意味着我们不再需要中间 makeEither.dhall
文件。
最后一个例子是我推荐的方法。具体来说:
- 使用
let
表达式避免重复使用constructors
关键字 - 让最终用户自己打电话给
constructors
,而不是替他们打电话
对于你的后一个问题,我认为应该放在一个单独的 Whosebug 问题中。
编辑: 请注意,constructors
关键字现在已过时,您现在可以只写:
let either = ./Either.dhall Text Natural
in [ either.Left "Foo", either.Right 1 ]
更多详情,请参阅: