是否可以在GHCi提示符下與任意Monad實例進行增量交互?Monads在提示符下?
您可以輸入「做」交互式命令:
Prelude> x <- return 5
但據我所知,一切都被迫進入IO()單子。如果我想要與任意Monad進行交互,該怎麼辦?
我是被迫寫命令的整個序列的巨型do { ... }
內部和/或直接使用中綴運算符?沒關係,但我更願意「輸入」一個任意monad,並且每次與它交互一行。
可能嗎?
是否可以在GHCi提示符下與任意Monad實例進行增量交互?Monads在提示符下?
您可以輸入「做」交互式命令:
Prelude> x <- return 5
但據我所知,一切都被迫進入IO()單子。如果我想要與任意Monad進行交互,該怎麼辦?
我是被迫寫命令的整個序列的巨型do { ... }
內部和/或直接使用中綴運算符?沒關係,但我更願意「輸入」一個任意monad,並且每次與它交互一行。
可能嗎?
當然可以。只是註釋你的類型。
例如對於Maybe Monad
:
let x = return 5 :: Maybe Int
將導致
Just 5
或乘坐列表單子:
let x = return 5 :: [Int]
將導致
[5]
當然,你也可以玩在monad裏面:
let x = return 5 :: Maybe Int
x >>= return . (succ . succ)
這將導致Just 7
我不認爲這是OP要求的;在我閱讀它的方式中,他希望互動會話的類型是Monad m => m a而不是IO a,而不僅僅是用monads做'事情'。 – valderman
@valdermann:你是對的......不過我發現這很有幫助很多次,並且在一個活躍的ghci會話中,這是唯一的方法(據我所知)「與任意monad進行交互」 – oliver
@oliver Nope,這不是我正在尋找的東西,但由於我所尋找的東西是不可能的,我想這是答案。在每行上輸入{it >> =}作爲前綴,可以獲得一些我想要的增量感覺,但需要幾個按鍵。謝謝! – tangentstorm
就目前情況來看,該IO
特異性行爲依賴方式IO
動作都有點statelike和無法伸縮。所以,你可以說這樣的話
s <- readFile "foo.txt"
,並得到一個實際值s :: String
。
,很明顯,它需要的不僅僅是Monad
結構更加維持那種互動。它也不會這麼容易
n <- [1, 2, 3]
說什麼值 n具有。
人們當然可以想象,使用ghci打開一個提示,允許在多個命令行交互中構造單粒計算do
-style,在提示關閉時執行整個計算。目前還不清楚這將意味着什麼檢查的中間值(除產生m (IO())
類型的印刷計算的集合,對於活躍單子m
,當然)。
但要問是否有什麼特別IO
,使一個很好的互動提示行爲可能可以分離和推廣這將是有趣。我不禁嗅到了一個關於互動的互動式價值背景故事的提示,但我還沒有追蹤它。有人可能會想象通過考慮將光標納入可能值空間的意思,以及IO
有一個光標強加於現實世界的光標。謝謝你的思考。
我明白你的觀點。它們有點過於通用。我特別想將它用於狀態monad,儘管您的光標概念也非常有趣。 – tangentstorm
查看ghc trac ticket http://hackage.haskell.org/trac/ghc/ticket/4316 – vivian