2014-04-01 107 views
0

我發現這個中的Monad.Reader問題22:用戶定義的二進制類型

data Color = R | B 
data Node a = E | N Color (Node a) a (Node a) 
type Tree a = Node a 

爲什麼不這樣呢?

data Node a = E | N Bool (Node a) a (Node a) 
type Tree a = Node a 
+8

因爲'顏色'更明確。 「真」是指紅色還是黑色? –

+0

@larsmans只需使用評論。 – ThePiercingPrince

+4

爲什麼在使用類型系統時使用註釋? – bheklilr

回答

8

larsmans說了這一切。爲什麼在你有機會在沒有它們的情況下以更清晰的方式呈現代碼時使用註釋?並且不要忘記,Color也會在類型級別上引起注意。

此外,想象一下,您想豐富考慮的顏色數量;那麼Bool將不再與Color同構。儘管在這段代碼中不太可能發生這種情況,但它被認爲是一種很好的做法。例如,我認爲最好寫data WeekDay = Monday | Tuesday | ...比說type WeekDay = Int -- ranging 0..7

如果我還沒有說服你,那麼請繼續使用Bool來代替。讓我們只希望,你永遠不會混淆什麼是什麼,並且爲了避免從一開始就避免的東西而浪費時間。

+1

紅黑樹的顏色數量並不會真的發生變化。 – sepp2k

+0

我不想有類型級別的區別。 – ThePiercingPrince

+2

@ThePiercingPrince但是,當使用'Bool'時,你已經有了類型級別的區別,所以我們現在可能稱之爲「真假樹」。正如你已經注意到的那樣,這兩種數據類型是同構的,所以在使用這兩種數據類型時沒有任何理論上的優勢,它只是歸結爲更易讀的代碼。 –

5

在這裏使用Bool有什麼好處?它被定義爲data Bool = False | True,所以它會執行完全一樣的;布爾運算對於Color沒有意義。

編輯:給予評論

@bheklilr因爲我想不使用類型系統

的答案是,文章顯然是作者要使用的類型系統。如果你不想要,沒有人強迫你,但是

  1. 現在還不清楚爲什麼在這種情況下使用Haskell;類型系統是其最大的優勢之一;

  2. 這在Haskell中被認爲是不好的風格。