如果我想比较类型或仅在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 asTypeOf
与const
完全相同,因为它返回了其第一个参数并完全忽略了其第二个。但是,它的类型迫使第二个论点与第一个论点相同。它旨在用背部写入infix。
它是为您具有过多多态性的亚表达而设计的,而GHC抱怨型号变量。您可以使用内联类型声明,但是如果没有ScopedTypeVariables
扩展,有时这是不可能的。如果您具有正确的类型的另一个值,则可以使用asTypeOf
从多态性表达式中"选择"适当的情况,而无需更改表达式返回的值。
我在这里使用它是"向后"的。我希望左侧的东西可以约束右侧的(忽略)孔的类型,而不是绕过。