7
我刚刚意识到小功能可以使用的功能有多大。如何让Haskell计算正确的多态类型?
例:
orderByLength = sortBy (compare `on` length)
但不幸的是,推断的类型可以是有点反直觉。
按照非常定义
f `on` g = \x y -> f (g x) (g y)
一个可以例如更换
(==) `on` length
与
\x y -> (length x) == (length y)
但两者有不同的类型!
第一个有[a] -> [a] -> Bool
,而第二个有正确的,更通用的[a] -> [b] -> Bool
类型。
这不允许明显正确的术语,如(on (==) length) [1, 2, 3] ["a", "b", "c"]
(它应该产生True
,但现在甚至无法进行类型检查)。
我知道这个限制是由于使用first-rank types而出现的,但是如何克服这个问题?有人可以制定一个能够正确处理多态函数(使用通用量化/等级-n类型)的实现on
吗?
很酷的事情 - 什么是'C'?一种'* - > *'?啊,这是为了包装'[type]'的潜在用途......你可以概括它为任何*种类*? – Dario 2009-12-01 20:51:53
很酷,谢谢你的两个想法 – Dario 2009-12-02 14:15:51