导出后什么时候应该加上括号?

时间:2018-07-10 22:45:17

标签: haskell deriving

我看到两个表情

data BinTree a = BTNil | BTNode a (BinTree a) (BinTree a) deriving Show

data Day = Sunday | Monday | Tuesday | Wednesday
         | Thursday | Friday | Saturday         deriving (Enum)

在导出后应该使用括号时,我感到困惑。我知道我们应该在有多个类的地方使用括号和逗号。

1 个答案:

答案 0 :(得分:6)

在每个合理的用例中,两者之间没有区别。

... deriving (A)
... deriving  A

完全等效。正如您已经正确指出的那样,如果要派生多个类,则必须使用括号。就个人而言,仅出于一致性考虑,我总是在括号中加上括号。但这完全是一种样式选择,只要您始终如一,就没关系了。


出于完整性的考虑,从技术上讲,有一种情况是必须的。如果由于某种原因您有一个作为操作员名称的类型类,则需要提供括号以使其起作用。

{-# LANGUAGE TypeOperators, MultiParamTypeClasses,
    GeneralizedNewtypeDeriving #-}

class (:+) a

-- newtype Foo a = Foo a deriving   :+   -- Definitely a syntax error
-- newtype Foo a = Foo a deriving  (:+)  -- Confuses the parser (error)
newtype Foo a    = Foo a deriving ((:+)) -- Works