首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Haskell中推导类型

在Haskell中推导类型
EN

Stack Overflow用户
提问于 2016-10-27 03:59:01
回答 1查看 172关注 0票数 0

代码语言:javascript
复制
f :: a -> Int
f arg = 2

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

EN

回答 1

Stack Overflow用户

发布于 2016-10-27 06:37:46

我不确定这是否真的有用..。但这里有一种方法:

代码语言:javascript
复制
> import Data.Typeable
> let argType f x = let _ = f x in typeOf x

示例:

代码语言:javascript
复制
> let f :: a->Int ; f arg = 2
> argType f 'a'
Char
> argType f 1
Integer

最后一个示例显示了GHC(i)缺省后1的实际类型。

一种更简单的替代方案,即使在源文件中也可以工作:当我们有

代码语言:javascript
复制
foo (bar x) (baz y)

我们想知道y的类型,我们可以将其替换为

代码语言:javascript
复制
foo (bar x) (baz (asTypeOf _ y))

我们将得到一个错误,例如

代码语言:javascript
复制
    • Found hole: _ :: Integer

它告诉我们y的类型。缺点:我们必须还原代码才能编译。

作为一个更低级的替代方案,使用-ddump-simpl编译,并观察正在生成的可怕的GHC核心。在那里,每个类型参数都是显式的:我们可以阅读类似f @ Char 'a'的内容,其中的名称可能会有一点混乱,例如Main.a$f @ GHC.Char 'a',但仍然可以理解发生了什么。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40271135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档