2015-07-13 27 views
0

在書「Scala中函數編程」的,它給出了關於副作用一些實例中,如:如果它從外部讀取一些數據而不是參數,它是一個純函數嗎?

  • 修改可變
  • 修改數據結構代替
  • 上設置一個字段對象
  • 拋出異常或停止,並顯示錯誤打印到控制檯或讀取用戶輸入
  • 讀取或寫入到一個文件中
  • 借鑑了SC reen

我的問題是,正在讀取來自外部的一些數據比參數使得函數不純嗎?

例如

val name = "Scala" 

def upcase() = name.toUpperCase 

upcase函數是純函數還是不是純函數?


編輯:按這樣的回答:https://stackoverflow.com/a/31377452/342235,我的「功能」是不實際的功能,這是一個方法,所以我給它的功能版本,並問同樣的問題:

val name = "Scala" 

val upcase:() => String =() => name.toUpperCase 
+0

因爲'name'本身是不可變的和'所有呼叫upcase'返回相同的輸出,'高清upcase'是純粹的。沒有變量被修改,一個新的不可變對象被創建並返回。 – 757071

+0

重要的是功能,而不是表達方式。 –

回答

5

不可改變數據讀數不不純;該函數每次仍會返回相同的值。如果name是一個var那麼該功能將是不純的,因爲外在的東西可以改變name,所以upcase()多次調用可能會評估不同的值。

(當然,也可以通過反射來改變name。我們只能談論關於什麼樣的函數可以調用給定函數的一些概念的純度,以及我們可以用什麼樣的副作用考慮到等價)

值得注意的是你的功能不純粹因爲toUpperCase不純正;這取決於系統的默認語言環境,並且可產生在不同的系統不同的結果(例如,在土耳其系統,"i".toUpperCase == "İ")。您應始終通過明確的Locale,例如def upcase() = name.toUpperCase(Locale.ENGLISH);那麼這個函數將是純粹的。

+0

感謝您用'toUpperCase'指出我的問題,從未注意到! – Freewind

-1

有趣的是,答案是「否」,但不是因爲你認爲它的原因。你upcase純函數。然而,它是純粹的,但它是一種方法,而不是一種功能。

+0

感謝您指出這一點,我只是更新了問題,添加'功能'版本 – Freewind

+0

它不取決於上下文嗎? –

+0

這有點迂腐。 – dcastro

相關問題