Rank-N类型的简单例子

#Haskell

考虑一段简单的代码:

highOrderFunc :: (Num b) => ([a] -> b) -> b
highOrderFunc f = f [1,2,3] + f ["a", "b", "c"]

main = do print $ highOrderFunc length

这里是无法通过编译的。

highOrderFunc的类型完整写出来实际上是:

highOrderFunc :: forall a b. (Num b) => ([a] -> b) -> b

对于一个highOrderFunc函数的实例,a只能是一个确定的类型,比如String,或者Int。

highOrderFunc f = f [1,2,3] + f ["a", "b", "c"]

但是这里要求a又可以是Int又可以是String。

所以使用Rank-2类型:

highOrderFunc :: forall b. (Num b) => (forall a. [a] -> b) -> b

此时对于一个highOrderFunc实例,f是一个泛型函数,a不再有只能确定为一个类型的限制。