2010-03-14 64 views
12

您是否知道Haskell中是否有指針?Haskell有指針嗎?

  • 如果是:你如何使用它們?他們有沒有問題?爲什麼他們不受歡迎?

  • 如果否:是否有任何理由呢?

+0

另請參見http://stackoverflow.com/questions/2386210/how-to-get-a-pointer-value-in-haskell – 2011-04-18 23:01:32

回答

19

是的。看看Foreign.PtrData.IORef

我懷疑這不是你所要求的。由於Haskell大部分沒有狀態,這意味着指針不適合語言設計。在函數之外有一個指向內存的指針意味着函數不再是純粹的,只允許指向當前函數內的值的指針是沒有用處的。

+19

我懷疑他正在尋找一種方式來傳遞大數據結構而不創建副本,基於錯誤的假設,即將值傳遞給函數會創建一個副本,就像在C++中按值執行時一樣。 – sepp2k 2010-03-14 19:21:47

+0

@ sepp2k或用於與內存映射設備交談。 – 2011-12-16 14:52:27

12

Haskell通過外部函數接口擴展提供指針。看看,例如,Foreign.Storable

指針用於與C代碼進行互操作。不是每天Haskell編程。

如果您正在尋找引用 - 指針到要發生變異的對象 - 有STRef和IORef,它提供許多相同用途的指針。然而,你應該很少 - 如果有的話 - 需要參考。

7

如果您只是希望避免複製較大的值,如sepp2k所假設的,那麼您不需要做任何事情:在大多數實現中,所有非平凡值都分別分配在一個堆上,並通過機器級地址相互引用即指針)。但是,再一次,你不需要做任何事情,它會照顧你。

要回答關於如何傳遞值的問題,可以採用任何方式傳遞它們:因爲無論如何不能改變值,它不會影響代碼的含義(只要嚴格尊重);通常這可以按照需要進行,除非你是通過例如編譯器可以看到的Int值已經被評估...

傳遞需求就像傳遞引用一樣,除了任何給定的引用都可以引用實際評估值(不能更改) ,或者爲尚未評估的值「thunk」。維基百科有more

+0

這是Haskell的主要優點之一:在大多數情況下,您必須做的很少以確保效率。 – avpx 2010-03-30 00:04:19