在“Haskell Programming from first principle”一書中說:
嚴格來說,單子對 Haskell 來說不是必需的。盡管當前的 Haskell 標準確實使用 monad 來構建和轉換 IO 操作,但 Haskell 的舊實作卻沒有。Monad 強大而有趣,但它們并沒有定義 Haskell。相反,monad 是根據 Haskell 定義的。
Haskell 的舊實作如何在不使用 Monad 的情況下構建和轉換 IO 操作?
uj5u.com熱心網友回復:
根據A History of Haskell: Being Lazy with Class(參見第 7 節),兩種主要方法是基于流的 IO 和基于延續的 IO。
在基于流的 IO 中,您的main程式是一個函式[Response] -> [Request],運行時系統向它提供一個神奇的惰性輸入串列。然后評估輸出,看看程式產生了什么請求;進行一些系統呼叫并將回應饋送到輸入串列中。您在撰寫時需要小心main,它在輸出相應請求之前不查看其輸入。
在基于延續的 IO 中,有一個抽象型別Behaviour(特別是被定義為上述[Response] -> [Request]型別,但重點是它不是必須的),并且 IO 原語需要將延續應用于其結果。
Behaviour :: Type
getLine :: (String -> Behaviour) -> Behaviour
putStrLn :: String -> (() -> Behaviour) -> Behaviour -- or equivalently, String -> Behaviour -> Behaviour
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/532462.html
標籤:哈斯克尔
