2014-03-13 46 views
2

我有一個代數數據類型,所有這些都在我的程序中使用。我意識到有一點我需要用一個簡單的字符串來註釋所有這種類型的結構。如何在Haskell中模擬ADT中的可選字段?

我不想通過大量的代碼來解釋爲我的常用類型添加一個字段。特別是因爲在我的程序中,在這個註釋中沒有任何有意義的價值,所以重構一千行代碼以進行微小的改變似乎過分了。

此外,由於類型非常複雜,只是複製類型並製作稍微不同的版本似乎很愚蠢。

這只是Haskell的一個弱點,還是我錯過了正確的處理方式?我認爲它是後者,但我找不到任何類似於可選參數的類型構造函數。

+5

我通常避免這種方式是不使用實際構造函數構造類型,而是通過函數構造類型。然後,我可以簡單地添加一個函數'createStructureAnnotated',它接受額外的參數並修改我的'createStructure'函數,使得未註釋的版本可以放入一個空字符串或其他類型。它不會破壞我已有的數千行代碼,並且我可以根據自己的需要或多或少地更改數據結構。 – bheklilr

回答

1

我不會去宣稱「Haskell的弱點」 - 更像是在處理ADT時(而不是在Haskell中)需要考慮的事情。

每個程序由「實體」和「動作」組成。你的問題是你需要修改一個實體(Haskell中的ADT)。

在OOP語言中,解決方案將很簡單 - 您輸入的子類。但是,如果您決定更改現有類中某個方法的簽名,您將別無選擇,只能通過整個代碼庫處理這些損壞。

在函數式語言中,函數是「便宜」的 - 每個函數都獨立於ADT並重構它通常很簡單。這是OOP語言的弱點嗎?不,它只是修改現有「動作」(在功能語言中很容易)和易於修改「實體」(在OOP語言中很容易)之間的一種折衷。

而且在實際注:

  1. 設計一個ADT是因爲改變是非常昂貴的非常重要的。

  2. @ bheklilr的建議是無價的 - 按照它!