Haskell中的演绎类型

时间:2016-10-26 19:59:01

标签: haskell

f :: a -> Int
f arg = 2

a是一种将在编译期间推断出来的类型。是否有可能了解Haskell如何推断出它?

1 个答案:

答案 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',但仍然可以了解正在发生的事情。