Obwohl ich neige dazu, sie nicht verwenden sehr häufig, in diesem Fall denke ich, dass ich die Liste Verständnis Version bevorzugen würde, weil es mir sauberer erscheint.
Wenn Sie in Punkt freie Art sind, können Sie dieses mögen auch:
f = zip `ap` map sqrt
ap Leben in Control.Monad und in diesem Fall kann es als S combinator gedacht werden, die verallgemeinert Anwendung in SKI calculus:
ap f g x == f x (g x)
ap const const == id
Wie Conal weist darauf hin, dies auch aus Monad verallgemeinert werden kann thusly (import Control.Applicative) applikative:
f = zip <*> map sqrt
Ich bezeichne dies als "undurchsichtiges Haskell". An einem bestimmten Punkt ist es nur unleserlich, der Punkt variiert bei der Belichtung. – Dan
Tatsächlich tendiere ich dazu, eine Funktion zu definieren, die ich aus Mangel an einem besseren Namen 'bewahren :: (a -> b) -> a -> (a, b)', definiert als einfach 'conservating = (id &&&) '. (Manchmal tausche ich auch die Tupelreihenfolge und definiere sie als '(&& & id)'; Ich sollte konsistent sein.) Ich bin immer ein wenig überrascht, dass es nirgends Standard zu verlassen scheint. –
Dan, ich denke, das ist wahrscheinlich das Einfachste Pfeil-Kombinator, um in echten Code zu verwenden.Sein Name ist schön evokativ: Sie können diese Codezeile laut lesen als "map id und sqrt to xs". – Carl