Рассмотрим этот пример (из https://codereview.stackexchange.com/info/23456/crtitique-my-haskell-function-capitalize):
import Data.Char
capWord [] = []
capWord (h:t) = toUpper h : map toLower t
capitalize = unwords . map capWord . words
Есть ли хороший способ абстрагироваться от преобразования "назад и вперед", например. unwords . f . words
? Лучшее, что я мог придумать, было
class Lift a b | a -> b where
up :: a -> b
down :: b -> a
instance Lift String [String] where
up = words
down = unwords
lifted :: (Lift a b) => (b -> b) -> a -> a
lifted f = down . f . up
capitalize = lifted (map capWord)
но он чувствует себя не очень гибким и нуждается в MultiParamTypeClasses
, FunctionalDependencies
, TypeSynonymInstances
и FlexibleInstances
- который может быть индикатором того, что он немного превышает верхний.