因此,我撰寫了一個程式來查詢外匯 API(外匯),它的作業原理就像一個魅力,但是當我想查詢每個可用的貨幣對時,它會評估所有 API 呼叫,因為它需要很長時間才能執行但什么也不列印。
import Data.Functor ((<&>))
supportedPairs :: IO (Maybe [(String, String)])
forex :: String -> String -> IO (Maybe (Scientific, UnixTime))
main :: IO ()
main = do
x <- supportedPairs
mapM_ (flip (<&>) print . uncurry forex) (fromJust x)
-- this prints nothing at all
單個呼叫就像這樣作業得很好:
main = do
x <- supportedPairs
u <- (uncurry forex . (flip (!!) 10 . fromJust)) x
print u
-- this prints "Just (438.685041,UnixTime {utSeconds = 1649588583, utMicroSeconds = 0})"
為什么在評估結果時不mapM_列印結果?如果我正確理解了 Haskell 的懶惰,那么如果不列印結果,它們不應該首先被評估嗎?
uj5u.com熱心網友回復:
檢查型別:
print是... -> IO ()。
因此,... <&> print是IO (IO ())。注意這里的雙 IO。
因此,對其進行映射,將運行“最外層 IO”,而不是“最內層 IO”。更具體地說,比較一下:
main = do
x <- print True >> return 5 -- x is 5
y <- return (print True >> return 5) -- y is an IO action
...
這里只執行第一個print True:第二個 IO 操作用于定義y,但在我們運行之前y它不會被執行。
最后一點:在這里,您不需要,<&>因為這會創建嵌套 IO。使用flip (>>=) print(或(=<<) print,或(>>= print))代替flip <&> print。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/462860.html
