Sono nuovo di Haskell e sono sconcertante su come esprimere al meglio alcune operazioni nel modo più idiomatico e chiaro. Attualmente (ce ne saranno altri a venire) Sono sconcertante su <*>
(non sono nemmeno sicuro di come chiamarlo).Haskell Idioma applicativo?
Ad esempio, se ho, diciamo
f = (^2)
g = (+10)
come funzioni rappresentative (in pratica sono più complesse, ma la cosa fondamentale è che sono diversi e distinti), quindi
concatMap ($ [1,2,3,4,10]) [(f <$>), (g <$>) . tail . reverse]
e
concat $ [(f <$>), (g <$>) . tail . reverse] <*> [[1,2,3,4,10]]
ottenere la stessa cosa.
È uno di questi Haskell più idiomatico, implica qualcosa di un lettore esperto di Haskell che l'altro non fa. Forse ci sono modi (migliori) aggiuntivi per esprimere esattamente la stessa cosa. Ci sono differenze concettuali tra i due approcci che un novizio di Haskeller come me può mancare?
è il vostro input sempre e solo andando essere una lista? Se è così, il primo è chiaramente migliore. Per input intendo l'elenco di numeri. – itsbruce
@itsbruce: buon punto. Sì, sempre e solo una lista. – orome
La combinazione dell'istanza 'Applicativo' o' Functor' per gli elenchi con 'concat' è molto sospetta. 'Functor + return + join = Monad', e per le liste,' concat = join'. Quindi se stai mappando e poi concatenando, 'concatMap' o' = << 'potrebbero essere più concisi. – dfeuer