F *中的适用函子:类型检查错误

时间:2018-08-08 22:24:41

标签: applicative fstar

作为一个尝试熟悉F *的实验,我尝试实现一个应用函子。我陷入了一个奇怪的类型检查错误。我不确定这是否是由于我不知道的类型检查中的某些功能/逻辑所致,还是由于真正的错误所致。

这是引起我麻烦的代码部分:

module Test

noeq type test : Type -> Type =
    | Apply : test ('a -> 'b) -> test 'a -> test 'b

val apply : test ('a -> 'b) -> test 'a -> test 'b
let apply f x = Apply f x

这是对应的错误:

Test(7,24-7,25): (Error 54) Test.test 'a is not a subtype of the expected type Test.test 'a (see also Test(7,12-7,13))
1 error was reported (see above)

有人可以向我指出我所缺少的吗?子类型会影响类型统一的行为吗?还是应该进行类型检查,这是编译器错误?

1 个答案:

答案 0 :(得分:1)

我相信您没有强制执行的归纳法存在一个宇宙不等式约束。

以下代码将进行类型检查:

noeq type test : Type0 -> Type =
    | Apply : test ('a -> 'b) -> test 'a -> test 'b

val apply : test ('a -> 'b) -> test 'a -> test 'b
let apply f x = Apply f x

注意第一行添加的0

之所以行之有效,是因为它声明第一个Type0位于比Type低的宇宙中(我相信,它本身意味着任何宇宙)。 对于您而言,F *不知道如何比较这两种类型的Universe,因此会失败。

如果您写过noeq type test : Type -> Type0,您会看到一条更好的错误消息:“未能解决归纳法的宇宙不等式”。所以我将错误消息归咎于这里。

如果解释不够准确,我不是PL人,我深表歉意...:)