让
f :: a -> Int
f arg = 2
a
是一种将在编译期间推断出来的类型。是否有可能了解Haskell如何推断出它?
答案 0 :(得分:3)
我不确定这是否真的有用......但这是一种方式:
> import Data.Typeable
> let argType f x = let _ = f x in typeOf x
示例:
> let f :: a->Int ; f arg = 2
> argType f 'a'
Char
> argType f 1
Integer
最后一个例子显示GHC(i)违约后1
的实际类型。
一个更简单的替代方案,甚至可以在源文件中工作:当我们有
时foo (bar x) (baz y)
我们想知道y
的类型,我们可以用
foo (bar x) (baz (asTypeOf _ y))
我们会收到错误,例如
• Found hole: _ :: Integer
告诉我们y
的类型。缺点:我们必须恢复代码才能编译。
作为更低级别的替代方案,使用-ddump-simpl
进行编译并观察正在生成的可怕的GHC Core。在那里,每个类型的参数都是明确的:我们可以读取类似f @ Char 'a'
的内容,其中名称可能会被破坏,例如Main.a$f @ GHC.Char 'a'
,但仍然可以了解正在发生的事情。