在GHC源文件中键入GHCI的最接近的等效物是什么?



如果我想比较类型或仅在haskell源文件中打印类型的信息,我有什么选项?

键入孔!

foo x =  length [x] + _

用GHC编译或加载到GHCI中将给出:

Found hole ‘_’ with type: Int
Relevant bindings include
  x :: a
  foo :: a -> Int

我最近发现的一个方便的技巧是将键入孔与 asTypeOf 1

结合使用。

如果您的代码 dim 编译,并且想知道其中的表达式是什么,将表达式替换为孔有时会弄乱事物,如:

           -- 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完全相同,因为它返回了其第一个参数并完全忽略了其第二个。但是,它的类型迫使第二个论点与第一个论点相同。它旨在用背部写入infix。

它是为您具有过多多态性的亚表达而设计的,而GHC抱怨型号变量。您可以使用内联类型声明,但是如果没有ScopedTypeVariables扩展,有时这是不可能的。如果您具有正确的类型的另一个值,则可以使用asTypeOf从多态性表达式中"选择"适当的情况,而无需更改表达式返回的值。

我在这里使用它是"向后"的。我希望左侧的东西可以约束右侧的(忽略)孔的类型,而不是绕过。

最新更新