首页 > 其他 > 详细

ghci对haskell的类型推导

时间:2014-03-17 04:26:34      阅读:554      评论:0      收藏:0      [点我收藏+]

今天这篇文章分析一下ghci交互解释器对类型的推导。

假设有函数fn定义如下:

let fn = map map

现在fn的类型是:

map map :: [a -> b] -> [[a] -> [b]]

推导过程:

1)首先map函数自身的类型为:

map :: (a -> b) -> [a] -> [b]

为了区分开第一个map和第二个map,将另外一个map的类型表示为:

map :: (a -> b) -> [a] -> [b]

在调用的过程中,有如下等式关系

(a -> b) -> [a] -> [b] = (a -> b)

由于curry的原因,此等式等同于

(a -> b) -> ([a] -> [b]) = (a -> b)

那么,可以得到:

a = a -> b
b = [a] -> [b]

将a‘,b‘的值代入[a‘] - > [b‘]最终得到

 [a -> b] -> [[a] -> [b]]

 

总结,ghci对复杂函数或表达式的类型推导就是一个简单的替换过程,不过有时候一眼看过去会很疑惑,不知道该类型所代表的意义,这是难以避免的。这是因为在haskell中大范围的使用了typeclass的概念,这个概念对应着C++中的模版,想象一下C++模版给代码带来的视觉冲击,初次使用时会很难阅读。在haskell中函数类型声明变得变本加厉,因为typeclass的存在,haskell的类型声明中大部分时候都是简单的小写字母表示,而这些字母本身并不能够带来任何类型信息的提示,大家看看这个被haskell程序员称为"boobs operator"的类型:

(.)(.) :: (a -> b -> c) -> a -> (a1 -> b) -> a1 -> c

一眼看过去大概明白这个函数是干什么的了吗?似乎很难,或许也没有必要去搞明白,不过大家可以尝试去推导一下哦:D

ghci对haskell的类型推导,布布扣,bubuko.com

ghci对haskell的类型推导

原文:http://www.cnblogs.com/richard-g/p/3603961.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!