类实例声明的说明

zep*_*pal 2 haskell class declaration

我正在遵循教程并找到了这段代码:

data A = B | C deriving(Eq)

class K a where
 f :: a -> Bool

instance K A where
 f x = x == C
 f _ = False
 
call = f B
Run Code Online (Sandbox Code Playgroud)

为什么我需要f _ = False?没有它我得到相同的结果。

lef*_*out 6

答案很简单:不需要这里f _ = False。事实上,如果您使用-Wallthen 进行编译,编译器会警告您该子句是多余的,因为该f x = ...子句已经捕获了所有内容。

如果教程告诉你要有这个额外的子句,那么,这是错误的。


che*_*ner 5

正如所指出的,这是没有必要的。

不过,如果您的定义略有不同,并且不需要实例,您可能需要(或想要)该行Eq

data A = B | C

class K a where
 f :: a -> Bool

instance K A where
 f C = True
 f _ = False
Run Code Online (Sandbox Code Playgroud)

您可以直接将参数与 进行比较x,然后定义以返回所有其他值,而不是与 进行比较。如果有更多的构造函数可以生成.CCfFalseFalse

data A' = B | C | D

instance K A' where
    f C = True
    f _ = False  -- in place of f B = False and f D = False
Run Code Online (Sandbox Code Playgroud)