[英]Regarding (When Executed) in Haskell IO Monad
我對IO Monad沒問題。 但我想了解以下內容:
(IO String)
是一個動作(執行時),它可以帶給您String類型的值。 很好,但是執行此操作的人/地點。 當然! 計算機正在執行此執行。 也可以 但是由於我只是一個初學者,所以希望您能原諒我問“執行”的訣竅在哪里。 我猜這不是用Haskell編寫的。 畢竟,這個后來的想法是否意味着將Haskell程序轉換為類似C的程序,並最終將其轉換為Assembly-> Machine code? 如果是這樣,在哪里可以找到Haskell中IO東西的實現? 非常感謝
Haskell函數與計算不同 。
計算是一條命令性代碼(也許用C或匯編程序編寫,然后編譯為機器代碼,可以直接在處理器上執行),它本質上是有效的,甚至不受其作用的限制。 也就是說,一旦運行,計算就可以訪問和更改任何內存並執行任何操作,例如與鍵盤和屏幕進行交互,甚至發射導彈。
相比之下,純語言的功能(例如Haskell)無法更改任意內存並發射導彈。 它只能更改其自己的內存部分,並返回以其類型指定的結果。
因此,從某種意義上說,Haskell是一種無能為力的語言。 Haskell是沒用的 。 在IO
整合到Haskell之前,這是1990年代的主要問題。
現在, IO a
值是指向單獨准備的計算的鏈接,最終有望產生a
。 您將無法使用純Haskell函數創建IO a
。 所有IO
原語都是單獨設計的,並打包到GHC中。 然后,您可以將這些簡單的計算組合成不那么瑣碎的計算,最終您的程序可能會產生您想要的任何效果。
不過有一點:純函數是相互獨立的 ,如果將它們一起使用,它們只會相互影響。 另一方面,計算可以彼此自由交互(如我所說,它們通常可以做任何事情),因此可以(也可以)偶然地相互破壞。 這就是為什么用命令式語言編寫的軟件中存在如此多的錯誤! 因此,在Haskell中,計算保存在IO
。
我希望這至少可以消除您的一些困惑。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.