Я только что понял, насколько полезной может быть маленькая on
-функция.
Ex:
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
, но теперь даже не проходит проверку типов).
Я знаю, что это ограничение возникает из-за использования типов первого ранга , но как это преодолеть? Может ли кто-нибудь сформулировать реализацию on
, которая может правильно работать с полиморфными функциями (используя универсальные типы количественного определения / ранга-n)?