Есть ли лучший способ выразить функцию абсолютной ошибки в точечной нотации?
В точном обозначении:
absoluteError x y = abs (x-y)
Непонятный пример в беззадачной нотации:
absoluteError' = curry (abs . uncurry (-))
Ответы
Ответ 1
Вот как вы могли бы вывести его сами, небольшими шагами:
absoluteError x y = abs (x-y) = abs ((-) x y) = abs ( ((-) x) y)
= (abs . (-) x) y = ( (abs .) ((-) x) ) y =
= ( (abs .) . (-) ) x y
поэтому eta-reduction, если f x y = g x y
заключаем f = g
.
Далее, используя _B = (.)
на мгновение,
(abs .) . (-) = _B (abs .) (-) = _B (_B abs) (-) = (_B . _B) abs (-)
= ((.) . (.)) abs (-)
Ответ 2
Вот несколько способов.
- старомодный:
absoluteError = (abs .) . (-)
- используйте так называемый "оператор сиськов" или "оператор совы"
absoluteError = ((.) . (.)) abs (-)
-
назовите оператора сиськи чем-то более политически правильным (и то, что черт, обобщите его в одно и то же время)
(.:) = fmap fmap fmap
absoluteError = abs .: (-)
-
используя комбинаторы семантического редактора:
result :: (o1 -> o2) -> (i -> o1) -> (i -> o2)
result = (.)
absoluteError = (result . result) abs (-)
Конечно, это все тот же трюк, только с разными именами. Наслаждайтесь!