让
f :: a -> Int
f arg = 2a是一种将在编译期间推导出来的类型。有没有可能了解Haskell是如何推导出来的?
发布于 2016-10-27 06:37:46
我不确定这是否真的有用..。但这里有一种方法:
> 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核心。在那里,每个类型参数都是显式的:我们可以阅读类似f @ Char 'a'的内容,其中的名称可能会有一点混乱,例如Main.a$f @ GHC.Char 'a',但仍然可以理解发生了什么。
https://stackoverflow.com/questions/40271135
复制相似问题