在 GHC 源文件中,与 GHCI 中的 :type 最接近的等效方式是什么?

3

如果我想在Haskell源文件中比较类型或仅打印类型信息,我有哪些选项?

2个回答

7

类型占位符!

foo x =  length [x] + _

使用GHC编译或在GHCi中加载将得到以下结果:
Found hole ‘_’ with type: Int
Relevant bindings include
  x :: a
  foo :: a -> Int

4

最近我发现的一个有用技巧是将类型洞与asTypeOf1结合使用。

如果您有编译成功的代码,并且想知道其中某个表达式的类型,有时用类型洞替换该表达式会使事情变得混乱,例如:

           -- what is the type of this part, I wonder?
f xs = 3 * length xs

length xs 替换为 _,报告如下:
foo.hs:1:12: Warning:
    Found hole ‘_’ with type: a
    Where: ‘a’ is a rigid type variable bound by
               the inferred type of f :: t -> a at foo.hs:1:1

length xs 显然不是类型 a

但如果你使用 asTypeOf,你可以保留 length xs 并插入一个空洞,它必须具有与它相同的类型:

f xs = 3 * (length xs `asTypeOf` _)

现在我们得到了:
foo.hs:1:34: Warning:
    Found hole ‘_’ with type: Int

更好了。
1 asTypeOfconst完全相同,因为它返回其第一个参数并完全忽略其第二个参数。但是,它的类型强制第二个参数与第一个参数相同;它被设计为在反引号中写入。
当您具有过于多态的子表达式,并且GHC抱怨模糊的类型变量时,它被设计用来写内联类型声明,但有时这是不可能的,除非使用ScopedTypeVariables扩展。如果您有另一个正确类型的值,则可以使用asTypeOf从多态表达式中“选择”适当的情况,而不更改表达式返回的值。
我在此处使用它的方式与预期的情况“相反”;我希望左侧的内容约束右侧的(被忽略的)空洞的类型,而不是相反。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接