Nella notazione pointful:Esiste un modo migliore per esprimere la funzione di errore assoluto nella notazione point-free?
absoluteError x y = abs (x-y)
Un esempio chiaro in notazione pointfree:
absoluteError' = curry (abs . uncurry (-))
Nella notazione pointful:Esiste un modo migliore per esprimere la funzione di errore assoluto nella notazione point-free?
absoluteError x y = abs (x-y)
Un esempio chiaro in notazione pointfree:
absoluteError' = curry (abs . uncurry (-))
Ecco come si potrebbe ricavare da soli, a piccoli passi:
absoluteError x y = abs (x-y) = abs ((-) x y) = abs (((-) x) y)
= (abs . (-) x) y = ((abs .) ((-) x)) y =
= ((abs .) . (-)) x y
così, da eta-reduction, se f x y = g x y
concludiamo f = g
.
Inoltre, utilizzando _B = (.)
per un momento,
(abs .) . (-) = _B (abs .) (-) = _B (_B abs) (-) = (_B . _B) abs (-)
= ((.) . (.)) abs (-)
Ecco una manciata di modi.
absoluteError = (abs .) . (-)
absoluteError = ((.) . (.)) abs (-)
nome dell'operatore tette qualcosa di più politicamente corretto (e che diamine, generalizzare allo stesso tempo)
(.:) = fmap fmap fmap
absoluteError = abs .: (-)
usando semantic editor combinators:
result :: (o1 -> o2) -> (i -> o1) -> (i -> o2)
result = (.)
absoluteError = (result . result) abs (-)
Naturalmente, questi sono tutti lo stesso trucco, solo con nomi diversi. Godere!
Perché non è '.:' Definito ovunque standard, comunque? O è? – leftaroundabout
@leftroundabout È definito in diversi pacchetti di hackage, ma è una definizione così minuscola che la maggior parte delle persone non ritiene che la dipendenza extra valga la pena, credo. –
+1 per 'fmap fmap fmap'. –
'(ass.). (-) ' – Vitus
Se è chiaro nella notazione a punta, allora cosa c'è di sbagliato in esso? Questo sembra il tipo di esempio in cui qualsiasi versione point-free deve essere letta convertendo mentalmente indietro comunque ... – Ben