2014-04-01 78 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中被认为是不好的风格。