この Haskell 式がどのように機能するかを理解するのに苦労しています:
import Control.Monad
import System.IO
(forM_ [stdout, stderr] . flip hPutStrLn) "hello world"
その部分は正確に何をしているの. flip hPutStrLn
ですか?型シグネチャは複雑に見えます:
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
(.)
式が評価されると、演算子の左右のオペランドは何になりますか?
私の質問をする別の方法は、上部の式の左側の部分が次のような型シグネチャになる方法です。
(forM_ [stdout, stderr] . flip hPutStrLn) :: String -> IO ()