2014-02-17 93 views
8

我看過algo.monadsfluokitten文檔。我還閱讀了通過Jim DueyKonrad HinsenLeonardo Borges monad博客條目。是否有可能在Clojure中從Haskell做IO monad?

我能找到的最接近的是Konrad Hinsen's library Monadic IO streams - 但這似乎並沒有「實施單子接口」(一個更好的措辭想要的)

這是例如在Haskell

oneST :: ST s Int -- note that this works correctly for any s 
oneST = do var <- newSTRef 0 
      modifySTRef var (+1) 
      readSTRef var 

one :: Int 
one = runST oneST 
使用ST

我的問題是:是否可以在Clojure中做IO Monad from Haskell你能提供一個例子嗎?

+0

Clojure不是動態類型語言嗎?那麼像IO或ST這樣的單子有什麼好處呢?拋出非法操作的例外情況?採取這種做法可能比在程序流程後期處理非法操作的影響更好。 – ziggystar

+3

您希望在Clojure中重用的Haskell'IO'的具體功能是什麼? –

+5

是的,這是可能的。 – augustss

回答

14

有幾種方法可以回答這個問題。

  • 中平凡: 想想IO作爲授予副作用工作的特殊權限的單子轉換。然後,Clojure中的任何monad都是IO monad,因爲在Clojure中執行副作用不是特權操作。

  • 很難: Clojure是圖靈完整的,所以你可以實現所有的Haskell,包括在Clojure中的IO monad。 Haskell是圖靈完備的,所以你可以在Haskell中實現所有的Clojure並展示IO monad。

沒有

  • 的哲學:的IO單子的本質,保持純度,同時與類型系統集成,是Clojure的雜質和動態類型不兼容。任何試圖在IO monad中激勵的嘗試都會與Clojure的哲學不一致,或者無法捕捉到具有IO monad的基本點。

也許

  • 部分:在這個問題聯繫到一元-IO流庫是用於與algo.monads庫,或者它的前身使用。 monadic接口是狀態monad。 Monadic-io-streams提供一些監獄IO單點功能來處理它。這並不妨礙您使用任何帶有副作用的其他功能,並且沒有集成IO的類型系統,沒有系統的方式來說哪個是哪個。這不是IO monad;它只是做了一些類似IO monad的事情。這很有趣,但是效用可疑。

  • 某天:Typed Clojure有興趣。如果副作用被添加到類型系統中,那麼爲了某些目的可能需要以結構化方式將它們隔離開來,並給出在類型化Clojure中存在類似IO monad之類的原因。