我可以在 GHC 上完全禁用类型检查,以便将其用作功能语言的编译目标吗?
Can I disable type-checking entirely on GHC, in order to use it as a compile-target for functional languages?
GHC 在这一点上快得惊人。不过,我对 Haskell 的类型系统不满意,所以我决定将自己的系统实现为 DSL。现在,我想通过翻译 post-检查无类型 lambda 演算表达式,将我的语言编译为 Haskell,以便使用 GHC 的性能。唯一的问题是我系统上的某些有效表达式无法在 GHC 上编译。我怎样才能避免这个问题 - 即通过告诉 GHC "I've already checked this, trust me"?
完全禁用类型系统
你可以在每个子项前加上一个 unsafeCoerce
(或者,如果你有雄心壮志,只在那些真正需要它的子项前)。
在评论中,您询问如何注释此术语以使其进行类型检查:
div = (\ v0 -> (\ v1 -> (\ v2 -> (\ v3 -> ((v1 (\ v4 -> (v4 v3))) ((v0 (((v1 (\ v4 -> (\ v5 -> (\ v6 -> (v4 (\ v7 -> ((v5 v7) v6))))))) (\ v4 -> v4)) (\ v4 -> (\ v5 -> (v5 (v2 v4)))))) (((v1 (\ v4 -> (\ v5 -> v4))) (\ v4 -> v4)) (\ v4 -> v4))))))))
I 运行 :s/(/unsafeCoerce (/g
in vim, 导致这一项:
div = unsafeCoerce (\ v0 -> unsafeCoerce (\ v1 -> unsafeCoerce (\ v2 -> unsafeCoerce (\ v3 -> unsafeCoerce (unsafeCoerce (v1 unsafeCoerce (\ v4 -> unsafeCoerce (v4 v3))) unsafeCoerce (unsafeCoerce (v0 unsafeCoerce (unsafeCoerce (unsafeCoerce (v1 unsafeCoerce (\ v4 -> unsafeCoerce (\ v5 -> unsafeCoerce (\ v6 -> unsafeCoerce (v4 unsafeCoerce (\ v7 -> unsafeCoerce (unsafeCoerce (v5 v7) v6))))))) unsafeCoerce (\ v4 -> v4)) unsafeCoerce (\ v4 -> unsafeCoerce (\ v5 -> unsafeCoerce (v5 unsafeCoerce (v2 v4)))))) unsafeCoerce (unsafeCoerce (unsafeCoerce (v1 unsafeCoerce (\ v4 -> unsafeCoerce (\ v5 -> v4))) unsafeCoerce (\ v4 -> v4)) unsafeCoerce (\ v4 -> v4))))))))
这在 ghci 中加载,但我不知道它是否有效(或者即使我应该期望它有效)。
编辑:经过一些检查,这可能并不是真正的 fair/correct 强制转换方式。 (特别是,它会导致像 v1 unsafeCoerce (\v4 -> ...)
这样的子项——我们不应该在任何地方将 unsafeCoerce
作为参数传递。)更正确的插入是在每个应用程序中插入一个 unsafeCoerce
点,像这样:
div = (\ v0 -> (\ v1 -> (\ v2 -> (\ v3 -> (unsafeCoerce (v1 (\ v4 -> (unsafeCoerce v4 v3))) (unsafeCoerce (v0 (unsafeCoerce (unsafeCoerce (unsafeCoerce v1 (\ v4 -> (\ v5 -> (\ v6 -> (unsafeCoerce v4 (\ v7 -> (unsafeCoerce (unsafeCoerce v5 v7) v6))))))) (\ v4 -> v4)) (\ v4 -> (\ v5 -> (unsafeCoerce v5 (unsafeCoerce v2 v4)))))) (unsafeCoerce (unsafeCoerce (unsafeCoerce v1 (\ v4 -> (\ v5 -> v4))) (\ v4 -> v4)) (\ v4 -> v4))))))))
GHC 在这一点上快得惊人。不过,我对 Haskell 的类型系统不满意,所以我决定将自己的系统实现为 DSL。现在,我想通过翻译 post-检查无类型 lambda 演算表达式,将我的语言编译为 Haskell,以便使用 GHC 的性能。唯一的问题是我系统上的某些有效表达式无法在 GHC 上编译。我怎样才能避免这个问题 - 即通过告诉 GHC "I've already checked this, trust me"?
完全禁用类型系统你可以在每个子项前加上一个 unsafeCoerce
(或者,如果你有雄心壮志,只在那些真正需要它的子项前)。
在评论中,您询问如何注释此术语以使其进行类型检查:
div = (\ v0 -> (\ v1 -> (\ v2 -> (\ v3 -> ((v1 (\ v4 -> (v4 v3))) ((v0 (((v1 (\ v4 -> (\ v5 -> (\ v6 -> (v4 (\ v7 -> ((v5 v7) v6))))))) (\ v4 -> v4)) (\ v4 -> (\ v5 -> (v5 (v2 v4)))))) (((v1 (\ v4 -> (\ v5 -> v4))) (\ v4 -> v4)) (\ v4 -> v4))))))))
I 运行 :s/(/unsafeCoerce (/g
in vim, 导致这一项:
div = unsafeCoerce (\ v0 -> unsafeCoerce (\ v1 -> unsafeCoerce (\ v2 -> unsafeCoerce (\ v3 -> unsafeCoerce (unsafeCoerce (v1 unsafeCoerce (\ v4 -> unsafeCoerce (v4 v3))) unsafeCoerce (unsafeCoerce (v0 unsafeCoerce (unsafeCoerce (unsafeCoerce (v1 unsafeCoerce (\ v4 -> unsafeCoerce (\ v5 -> unsafeCoerce (\ v6 -> unsafeCoerce (v4 unsafeCoerce (\ v7 -> unsafeCoerce (unsafeCoerce (v5 v7) v6))))))) unsafeCoerce (\ v4 -> v4)) unsafeCoerce (\ v4 -> unsafeCoerce (\ v5 -> unsafeCoerce (v5 unsafeCoerce (v2 v4)))))) unsafeCoerce (unsafeCoerce (unsafeCoerce (v1 unsafeCoerce (\ v4 -> unsafeCoerce (\ v5 -> v4))) unsafeCoerce (\ v4 -> v4)) unsafeCoerce (\ v4 -> v4))))))))
这在 ghci 中加载,但我不知道它是否有效(或者即使我应该期望它有效)。
编辑:经过一些检查,这可能并不是真正的 fair/correct 强制转换方式。 (特别是,它会导致像 v1 unsafeCoerce (\v4 -> ...)
这样的子项——我们不应该在任何地方将 unsafeCoerce
作为参数传递。)更正确的插入是在每个应用程序中插入一个 unsafeCoerce
点,像这样:
div = (\ v0 -> (\ v1 -> (\ v2 -> (\ v3 -> (unsafeCoerce (v1 (\ v4 -> (unsafeCoerce v4 v3))) (unsafeCoerce (v0 (unsafeCoerce (unsafeCoerce (unsafeCoerce v1 (\ v4 -> (\ v5 -> (\ v6 -> (unsafeCoerce v4 (\ v7 -> (unsafeCoerce (unsafeCoerce v5 v7) v6))))))) (\ v4 -> v4)) (\ v4 -> (\ v5 -> (unsafeCoerce v5 (unsafeCoerce v2 v4)))))) (unsafeCoerce (unsafeCoerce (unsafeCoerce v1 (\ v4 -> (\ v5 -> v4))) (\ v4 -> v4)) (\ v4 -> v4))))))))