我无法理解这个 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 ()