4

我有一个简单的类型

data Day =  Monday | Tuesday | Wednesday | Thursday | Friday

我是haskell的新手,所以我写==如下。

(==) :: Day -> Day -> Bool
Monday == Monday = True
Tuesday == Tuesday = True
Wednesday == Wednesday = True
...
x == y = False

有没有更短的方法来编写==实现?

4

2 回答 2

12

您可以使用以下deriving关键字让编译器自动生成这些:

data Day = Monday | Tuesday | Wednesday | Thursday | Friday
           deriving Eq

这将为您的数据类型定义==/=

“可以为任何数据类型导出 Eq,其成分也是 Eq 的实例。” http://www.haskell.org/ghc/docs/7.4.2/html/libraries/base/Data-Eq.html

于 2012-09-19T14:20:06.140 回答
6

你可以写

data Day =  Monday | Tuesday | Wednesday | Thursday | Friday
  deriving Eq

这意味着 GHC 将自动为 Day 生成一个 Eq 实例。它将生成 (==) 使得Monday == Monday, Tuesday == Tuesdayis Trueetc, 但是Monday == FridayFalse

请注意,您不能写类似

(==) :: Day -> Day -> Bool
x == x = True
x == y = False

这也许就是你所想的。

如果你尝试,GHC 会抱怨 x 的定义冲突。

于 2012-09-19T14:20:38.420 回答