2016-02-25 29 views
2

來自C#背景,我會說ref關鍵字在某些情況下非常有用,在這種情況下,需要更改方法參數以直接影響值類型的傳遞值,以便將參數設置爲null通過Haskell中的引用?

而且,out關鍵字可以在返回大量各種邏輯上不相關的值時派上用場。

我的問題是:是否有可能在Haskell中通過引用將參數傳遞給函數?如果不是,直接選擇(如果有的話)是什麼?

+1

是的,你可以通過引用傳遞並改變值; [在這個答案中檢查'mutate_inplace'函數](http://stackoverflow.com/questions/33820971/haskell-use-last-reference-to-a-variable-to-efficiently-create-a-new-variable/33827943 #33827943) –

+0

@ behzad.nouri:感謝您的參考,但我會留下我的回答,因爲我認爲這屬於我提到的'做'魔法。 – fjarri

+4

你爲什麼想要這樣做?參考文獻違背了Haskell模型的粒度。花你的努力,而不是學習作爲一個功能程序員思考。無論如何,作爲C#程序員,「ref」和「out」是我最不喜歡的語言之一;哈斯克爾不支持他們,我說很好的解脫。 –

回答

5

這取決於上下文。沒有任何背景,不,你不能(至少不是你的意思)。有了上下文,如果你願意,你可以很好地做到這一點。特別是,如果你在IOST工作,你可以分別使用IORefSTRef,以及可變數組,向量,哈希表,弱哈希表(我相信IO)等等。一個函數可以使用一個或更多這些,併產生一個行動(執行時)將修改這些引用的內容。

另一種上下文StateT給出了純粹實現的可變「狀態」值的錯覺。您可以使用複合狀態並將鏡頭傳入其中,以模擬特定用途的參考。

5

我的問題是:是否有可能在Haskell中通過引用將參數傳遞給函數?如果不是,直接選擇(如果有的話)是什麼?

不,在Haskell值是不可變的(當然,在do符號可以創建可變性的一些幻想,但是這一切都發生在一個函數內部,是一個完全不同的主題)。如果你想改變這個值,你將不得不返回改變的值並讓調用者處理它。例如,請參閱隨機數生成函數next,該函數返回值更新後的RNG。

此外,out關鍵字可以派上用場時,返回各種邏輯上不相關的各種值。

因此,您也不能有out。如果你想返回幾個完全斷開的值(在這一點上,你應該想到爲什麼從一個函數返回斷開的值),返回一個元組。

5

在Haskell和ML等語言中,「按值傳遞」和「按引用傳遞」沒有區別,因爲無法將這些語言的變量分配給。在影響任何傳遞的變量時,首先「改變方法參數」是不可能的。