⬑
Rank-N类型的简单例子
考虑一段简单的代码:
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不再有只能确定为一个类型的限制。