ghci对haskell的类型推导

今天这篇文章分析一下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

posted @ 2014-03-16 21:51  Liqiang Gao  阅读(1067)  评论(0编辑  收藏  举报