在Haskell中定义代数数据类型时

Jam*_*mes 0 haskell types show

为什么在下面导出Read,Show以及它们做什么是一个好主意?

bhe*_*ilr 5

当您定义自己的数据类型时,通常会有许多类型的样板代码,您不需要自己编写.编译器通常可以为您解决这个问题.

例如,如果您有类型

data Direction = North | South | East | West
Run Code Online (Sandbox Code Playgroud)

你无法做到

if direction == North then ...
Run Code Online (Sandbox Code Playgroud)

因为你还没有写过Eqfor 的实例Direction.你可以写

instance Eq Direction where
    North == North = True
    South == South = True
    East  == East  = True
    West  == West  = True
    _     == _     = False
Run Code Online (Sandbox Code Playgroud)

但这是额外的6行代码,实际上无法帮助您或其他人理解您的代码.这同样与类,如Show,Ord,Enum,Bounded,Read,和Functor,这些都占用宝贵的时间和精力来写的时候这是很平凡的编译器弄清楚所有的本身.这就是该deriving子句的用武之地.我提到的所有类型类都是可派生的(虽然Functor需要DeriveFunctorGHC中的扩展),还有一些其他类型.它所做的就是指示编译器弄清楚这些类型类本身的实现,所以

data Direction = North | South | East | West
    deriving (Eq, Ord, Enum, Bounded, Show, Read)
Run Code Online (Sandbox Code Playgroud)

会产生很多你自己可以编写的代码,但这样做并不是很有趣.-ddump-deriv如果需要,您可以看到通过使用标志进行编译而生成的代码,但由于它是编译器生成的,因此它不会非常漂亮.