簡體   English   中英

為什么 Scala 沒有 IO Monad?

[英]Why doesn't Scala have an IO Monad?

我想知道為什么 Scala 沒有像 Haskell 這樣的 IO Monad。

因此,在 Scala 中,方法readLine的返回類型是 String,而在 Haskell 中,類似的函數getLine的返回類型為 IO String。

關於這個話題有一個類似的問題,但它的回答並不令人滿意:

使用 IO 肯定不是 scala 中的主導風格。

有人可以進一步解釋一下嗎? 不將 IO Monads 包含到 Scala 的設計決策是什么?

因為 Scala 不是純的(並且沒有辦法強制一個函數是純的,就像 D 一樣)並且允許副作用。 它與 Java 密切交互(例如重用 Java 庫的大部分)。 Scala 並不懶惰,因此像 Haskell 中的執行順序沒有問題(例如,不需要>>seq )。 在這種情況下,引入 IO Monad 會使生活變得更加艱難,而不會獲得太多。

但是,如果您確實擁有 IO monad 具有顯着優勢的應用程序,那么沒有什么可以阻止您編寫自己的實現或使用 scalaz。 參見例如http://apocalisp.wordpress.com/2011/12/19/towards-an-effect-system-in-scala-part-2-io-monad/

[編輯]

為什么不把它作為一種懶惰和純粹的語言來完成?

這本來是完全可能的(例如,看看Frege ,一種與 Haskell 非常相似的 JVM 語言)。 當然,這會使 Java 互操作性變得更加復雜,但我認為這不是主要原因。 我認為懶惰和純粹的語言是一件非常酷的事情,但對於大多數 Java 程序員來說太陌生了,他們是 Scala 的目標受眾。 Scala 被設計為與 Java 的對象模型合作(這與純粹和惰性完全相反),允許函數式和混合函數式面向對象編程,但不強制執行它(這會趕走幾乎所有 Java 程序員)。 事實上,擁有另一種完全函數式語言是沒有意義的:有 Haskell、Erlang、F#(和其他 ML)和 Clojure(和其他 Schemes / Lisps),它們都非常復雜、穩定和成功,並且不會很容易被新人取代。

有關如何在 Scala 中實現 IO monad 的全面介紹,請參閱此演示文稿(下載以獲得完美質量):

https://www.slideshare.net/pjschwarz/game-of-life-polyglot-fp-haskell-scala-unison-part-1 https://www.slideshare.net/pjschwarz/game-of-life-polyglot -fp-haskell-scala-unison-part-2

在此處輸入圖片說明 在此處輸入圖片說明 在此處輸入圖片說明 在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM