我有一些軟件設計經驗,現在我正在學習Haskell。在許多現實世界的軟件開發,一個面臨着類似給出的情況,例如,如下所示:如何重構Haskell函數代碼鏈?
想,我有這樣的代碼現在
f1 a b c d = e
where
e1 = f2 b c (f3 a)
e2 = f4 d
e = e1 + e2
f2 b c d = n + c + d
where
n = f5 b
f5 n = n*n
f3 a = a * 2
f4 a = a + 3
,如果我想改變F5,這樣只有在尚未另一個參數,我將不得不將所有的功能鏈改變到f1。 它可以如下所示完成。請注意添加的參數x。
f1 a b c d x = e -- f1 needs to be changed
where
e1 = f2 b c (f3 a) x
e2 = f4 d
e = e1 + e2
f2 b c d x = n + c + d -- f2 needs to be changed
where
n = f5 b x
f5 n x = n*n -- f5 changed (**bang**)
f3 a = a * 2
f4 a = a + 3
這是做這類事情的正常哈斯克爾方式或是否有更好(更哈斯克爾十歲上下)的方式? 我知道API的這種變化會擾亂客戶端代碼,但是如何將影響保持在最低限度,並且有沒有Hasekll的方式?
在更一般的層面上:Haskell在這種情況下表現如何(特別是考慮到它的不變狀態特性)?它在這方面爲開發者提供了什麼?或者,Haskell本身沒有任何作用發揮其作用,而這只是一個難以解決的軟件工程問題(沒有像未來證明)?
對於在單個帖子中詢問多個問題,我表示歉意,但我無法幫助,因爲這些問題是相互關聯的。另外,我找不到類似的問題,很抱歉,如果我可能錯過了。
好了,你可以隨時更改簽名類型和參數列表(你正在寫類型的簽名,不是嗎?),然後看看那裏的編譯器抱怨。修復第一個問題,然後回到第2步,直到所有錯誤都用盡。如果你有一個共同的一套被傳遞到許多功能的參數,它很可能是更好地使新的數據類型來存儲所有這些值,那麼你就可以避開改變函數的參數,而是隻是改變類型的定義。這是一個軟件問題,不是真正的Haskell問題。 – bheklilr