出于某種原因,getLine 在我的 Jupiter 筆記本中不起作用。有什么方法可以人為地創建一個 IO 字串,這樣我就可以繼續一些需要它的例子了?
我試過這樣的事情:
main = do
foo :: IO String
foo << "sdf"
但顯然沒有作業。有什么辦法嗎?謝謝!
uj5u.com熱心網友回復:
type 的值IO String表示可能執行某些操作IO并在執行時產生 aString的操作(最終, from main)。通常,是從“標準輸入”( )getLine中讀取一行文本的操作。stdin如果您只想使用自己的操作來代替getLine,則可以非常簡單地使用pure :: (Applicative f) => a -> f awhere fisIO和aisString在這種情況下構造一個:
fakeGetLine :: IO String
fakeGetLine = pure "always the same string"
Aside:pure也return :: (Monad m) => a -> m a因為歷史原因而被呼叫,但沒有必要使用它,因為它是同一個函式,但名稱更長,型別更受限制。
現在,在任何你想輸入的地方,你都可以用或諸如 之類的運算式getLine來替換它。同樣,如果您需要一個常量,您可以使用or 。fakeGetLinepure "whatever string you wish to use"IO Intpure 123pure (123 :: Int)
您不能替換標準getLine,但可以使用您自己的同名定義,前提getLine是您使用import...hiding宣告從范圍中隱藏默認定義:
import Prelude hiding (getLine)
getLine :: IO String
getLine = pure "always the same string"
或者,您實際上可以在stdinIPython 筆記本中閱讀,只要您使用支持“輸入請求”功能的前端打開它,例如JupyterLab或Deepnote。據我所知,Hydrogen、nteract或Spyder目前不支持此功能。
最后,有時在 Python 中針對此問題推薦的一種方法在 Haskell 中不起作用,它試圖stdin用不同的句柄替換。這種技術在 Python 中是可行的,因為它stdin是一個可變變數,而在 Haskell 中,stdin(像所有變數一樣)是不可變的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/462873.html
標籤:哈斯克尔
下一篇:haskell中不同元組的串列
