Sto avendo difficoltà a capire come funziona questa espressione Haskell:Si prega di spiegare (forM_ [stdout, stderr] capovolgere hPutStrLn.) :: String -> IO()
import Control.Monad
import System.IO
(forM_ [stdout, stderr] . flip hPutStrLn) "hello world"
Qual è la parte . flip hPutStrLn
fare esattamente ? Le firme di tipo sembrare complicato:
ghci> :type flip
flip :: (a -> b -> c) -> b -> a -> c
ghci> :type (.)
(.) :: (b -> c) -> (a -> b) -> a -> c
ghci> :type (. flip)
(. flip) :: ((b -> a -> c1) -> c) -> (a -> b -> c1) -> c
ghci> :type (. flip hPutStrLn)
(. flip hPutStrLn) :: ((Handle -> IO()) -> c) -> String -> c
ciò che diventa operandi sinistro e destro del (.)
operatore l'espressione viene valutata?
Un altro modo per mettere la mia domanda è, come fa la parte sinistra dell'espressione all'estremità superiore con una firma di tipo simile:
(forM_ [stdout, stderr] . flip hPutStrLn) :: String -> IO()
confronta ': type (. HPutStrLn)' con ': type (. Flip hPutStrLn)' help a tutti? –
Chi scriverebbe tale codice? Lo stile point-free è davvero inutile qui e fa male la leggibilità, IMHO –
@NiklasB. non è male per me, anche se ricordo un periodo nel passato in cui sarebbe stato del tutto opaco. Dipende dalla tua familiarità con lo stile, penso (o meglio, ovviamente). – luqui