У меня эту функциюPointfree стиль программирования в Haskell
rulesApply :: [PhrasePair] -> Phrase -> Phrase
rulesApply pp = try (transformationsApply "*" reflect pp)
Я хочу узнать, как сделать это pointfree.
try :: (a -> Maybe a) -> a -> a
try f x = maybe x id (f x)
transformationsApply :: Eq a => a -> ([a] -> [a]) -> ([([a], [a])] -> ([a] -> Maybe [a]))
transformationsApply wc f pfPair list = foldr1 orElse (map (transformationApply wc f list) pfPair)
rulesApply pp = try (transformationsApply "*" reflect pp)
(transformationsApply "*" reflect) pp
имеет тип Eq a => ([([a], [a])] -> ([a] -> Maybe [a]))
Мы видим, что
try :: (a -> Maybe a) -> a -> a
так попробовать принимает функцию (a -> Maybe a)
в качестве аргумента. и мы видим, что возвращаемый тип (transformationsApply "*" reflect) pp
равен ([a] -> Maybe [a]))
, поэтому мы сможем писать.
rulesApply pp = try . (transformationsApply "*" reflect) pp
но это дает сообщение об ошибке.
В конце, вы можете сделать 'междусобойчик установить pointfree', который будет установлен инструмент командной строки, которая может взять функцию и преобразовать его в как можно ближе к pointfree, насколько это возможно. – bheklilr