मैं मुसीबत समझ कैसे इस हास्केल अभिव्यक्ति काम करता आ रही हैं:कृपया व्याख्या (forM_ [stdout, stderr] फ्लिप hPutStrLn।) :: स्ट्रिंग -> आईओ()
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()
': प्रकार (। HPutStrLn)' की तुलना करता है, 'टाइप (। Flip hPutStrLn)' सहायता के साथ? –
ऐसे कोड कौन लिखेंगे? पॉइंट-फ्री शैली वास्तव में यहां व्यर्थ है और पठनीयता को प्रभावित करती है, आईएमएचओ –
@ निकलासबी। यह मेरे लिए बहुत बुरा नहीं है, हालांकि मुझे अतीत में एक समय याद है जब यह पूरी तरह से अपारदर्शी होता। यह शैली के साथ आपकी परिचितता पर निर्भर करता है, मुझे लगता है (या बल्कि, स्पष्ट रूप से)। – luqui