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

В точечной нотации:

absoluteError x y = abs (x-y)

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

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


person Ben Hamner    schedule 13.06.2012    source источник
comment
Если это ясно в заостренной нотации, то что с этим не так? Это похоже на пример, когда любую бесточечную версию все равно придется читать, мысленно конвертируя обратно...   -  person Ben    schedule 13.06.2012


Ответы (2)


Вот как вы могли бы получить его самостоятельно, небольшими шагами:

absoluteError x y = abs (x-y) = abs ((-) x y) = abs ( ((-) x) y) 
                  = (abs . (-) x) y = ( (abs .) ((-) x) ) y = 
                  = ( (abs .) . (-) ) x y

Итак, с помощью эта-редукции, если f x y = g x y мы заключаем f = g.

Далее, используя на мгновение _B = (.),

(abs .) . (-) = _B (abs .) (-) = _B (_B abs) (-) = (_B . _B) abs (-)
              = ((.) . (.)) abs (-)
person Will Ness    schedule 13.06.2012
comment
Плюс один за предыдущую помощь и идеальный ответ - person Damián Rafael Lattenero; 02.11.2017

Вот несколько способов.

  1. по старинке: absoluteError = (abs .) . (-)
  2. используйте так называемого "оператора сисек", или "оператора совы" absoluteError = ((.) . (.)) abs (-)
  3. назовите оператора сисек как-нибудь более политкорректно (и какого черта, обобщите заодно)

    (.:) = fmap fmap fmap
    absoluteError = abs .: (-)
    
  4. используя комбинаторы семантического редактора:

    result :: (o1 -> o2) -> (i -> o1) -> (i -> o2)
    result = (.)
    
    absoluteError = (result . result) abs (-)
    

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

person Daniel Wagner    schedule 13.06.2012
comment
Почему .: нигде не определен стандарт? Либо это? - person leftaroundabout; 13.06.2012
comment
@leftroundabout Он определен в нескольких хакерских пакетах, но это такое крошечное определение, что большинство людей не считают, что дополнительная зависимость стоит затраченных усилий. - person Daniel Wagner; 13.06.2012
comment
@DanielWagner: Это? Я не мог найти его нигде. - person Bergi; 15.10.2014