用户定义的二进制类型

时间:2014-04-01 22:42:55

标签: haskell

我在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

2 个答案:

答案 0 :(得分:8)

larsmans说了这一切。为什么在没有它们的情况下有机会以更清晰的方式呈现代码时使用注释?并且不要忘记让Color也在类型级别上造成干扰。

此外,想象一下你想要丰富所考虑的颜色数量;然后Bool将不再与Color同构。尽管在这段特定的代码中不太可能发生这种情况,但它被认为是一种普遍的良好做法。例如,我认为写data WeekDay = Monday | Tuesday | ...比写type WeekDay = Int -- ranging 0..7更好。

如果到目前为止我还没有说服你,那么请继续使用Bool代替。让我们永远不要混淆哪些是你从一开始就可以避免的事情而浪费你的时间。

答案 1 :(得分:5)

在这里使用Bool有什么好处?它被定义为data Bool = False | True,所以它的表现完全相同;布尔运算对Color没有意义。

编辑:给出评论

  

@bheklilr因为我不想使用类型系统

答案显然是文章的作者想要使用类型系统。如果你不想,没有人强迫你,但

  1. 在这种情况下,根本不清楚为什么要使用Haskell;类型系统是其最大的优势之一;

  2. 这在Haskell中被认为是坏风格。