如果我想比较类型或仅在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
asTypeOf
与const
完全相同,因为它返回其第一个参数,而完全忽略其第二个参数。但是,它的类型强制第二个参数与第一个参数相同。它被设计为带有反引号的后缀。它用于当子表达式过于多态且GHC抱怨类型变量不明确时使用。您可以使用内联类型声明,但有时如果没有
ScopedTypeVariables
扩展名,这是不可能的。如果您有另一个正确类型的值,则可以使用asTypeOf
从多态表达式中“选择”适当的大小写,而无需更改该表达式返回的值。我在这里使用的是预期情况的“倒退”。我希望左边的东西约束右边的(忽略的)孔的类型,而不是相反。