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

最佳答案

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

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

           -- 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从多态表达式中“选择”适当的大小写,而无需更改该表达式返回的值。

我在这里使用的是预期情况的“倒退”。我希望左边的东西约束右边的(忽略的)孔的类型,而不是相反。

10-08 13:20