Есть ли лучший способ выразить функцию абсолютной ошибки в точечной нотации? - программирование
Подтвердить что ты не робот

Есть ли лучший способ выразить функцию абсолютной ошибки в точечной нотации?

В точном обозначении:

absoluteError x y = abs (x-y)

Непонятный пример в беззадачной нотации:

absoluteError' = curry (abs . uncurry (-))

4b9b3361

Ответ 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 (-)
    

Конечно, это все тот же трюк, только с разными именами. Наслаждайтесь!