Tôi đang gặp rắc rối hiểu cách biểu Haskell này hoạt động:Xin giải thích (forM_ [stdout, stderr] lật hPutStrLn.) :: String -> IO()
import Control.Monad
import System.IO
(forM_ [stdout, stderr] . flip hPutStrLn) "hello world"
các . flip hPutStrLn
phần làm chính xác là gì ? Chữ ký loại có vẻ phức tạp:
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
Toán hạng trái và phải của toán tử (.)
khi biểu thức được đánh giá là gì?
Một cách khác để đặt câu hỏi của tôi là, làm thế nào một phần trái của biểu thức vào cuối đầu với một loại chữ ký như thế này:
(forM_ [stdout, stderr] . flip hPutStrLn) :: String -> IO()
so sánh ': type (. HPutStrLn)' với ': type (. Flip hPutStrLn)' help at all? –
Ai sẽ viết mã như vậy? Phong cách điểm miễn phí thực sự vô nghĩa ở đây và làm tổn thương khả năng đọc, IMHO –
@NiklasB. nó không quá tệ với tôi, mặc dù tôi nhớ một thời gian trong quá khứ khi nó sẽ hoàn toàn mờ đục. Nó phụ thuộc vào sự quen thuộc của bạn với phong cách, tôi nghĩ (hay đúng hơn là, rõ ràng). – luqui