簡體   English   中英

關於(執行時)Haskell IO Monad

[英]Regarding (When Executed) in Haskell IO Monad

我對IO Monad沒問題。 但我想了解以下內容:

  1. 在所有/幾乎所有Haskell教程/教科書中,他們一直說getChar不是純函數,因為它可以給您帶來不同的結果。 我的問題是:誰說這首先是一個功能。 除非您為我提供此功能的實現,並且我研究該實現,否則我無法保證它是純函數。 那么,該實現在哪里?
  2. 在所有/幾乎所有的Haskell教程/教科書中,都說(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.

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