2011-08-11 44 views
9

是否可以在GHCi提示符下與任意Monad實例進行增量交互?Monads在提示符下?

您可以輸入「做」交互式命令:

Prelude> x <- return 5 

但據我所知,一切都被迫進入IO()單子。如果我想要與任意Monad進行交互,該怎麼辦?

我是被迫寫命令的整個序列的巨型do { ... }內部和/或直接使用中綴運算符?沒關係,但我更願意「輸入」一個任意monad,並且每次與它交互一行。

可能嗎?

+1

查看ghc trac ticket http://hackage.haskell.org/trac/ghc/ticket/4316 – vivian

回答

4

當然可以。只是註釋你的類型。
例如對於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

+2

我不認爲這是OP要求的;在我閱讀它的方式中,他希望互動會話的類型是Monad m => m a而不是IO a,而不僅僅是用monads做'事情'。 – valderman

+0

@valdermann:你是對的......不過我發現這很有幫助很多次,並且在一個活躍的ghci會話中,這是唯一的方法(據我所知)「與任意monad進行交互」 – oliver

+1

@oliver Nope,這不是我正在尋找的東西,但由於我所尋找的東西是不可能的,我想這是答案。在每行上輸入{it >> =}作爲前綴,可以獲得一些我想要的增量感覺,但需要幾個按鍵。謝謝! – tangentstorm

11

就目前情況來看,該IO特異性行爲依賴方式IO動作都有點statelike和無法伸縮。所以,你可以說這樣的話

s <- readFile "foo.txt" 

,並得到一個實際值s :: String

,很明顯,它需要的不僅僅是Monad結構更加維持那種互動。它也不會這麼容易

n <- [1, 2, 3] 

說什麼 n具有。

人們當然可以想象,使用ghci打開一個提示,允許在多個命令行交互中構造單粒計算do -style,在提示關閉時執行整個計算。目前還不清楚這將意味着什麼檢查的中間值(除產生m (IO())類型的印刷計算的集合,對於活躍單子m,當然)。

但要問是否有什麼特別IO,使一個很好的互動提示行爲可能可以分離和推廣這將是有趣。我不禁嗅到了一個關於互動的互動式價值背景故事的提示,但我還沒有追蹤它。有人可能會想象通過考慮將光標納入可能值空間的意思,以及IO有一個光標強加於現實世界的光標。謝謝你的思考。

+0

我明白你的觀點。它們有點過於通用。我特別想將它用於狀態monad,儘管您的光標概念也非常有趣。 – tangentstorm