我们什么时候应该在推导后加上括号?

use*_*628 1 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)
Run Code Online (Sandbox Code Playgroud)

在导出后我应该使用括号时,我很困惑.我知道我们应该使用括号和逗号,其中有多个类.

Sil*_*olo 6

在每个明智的用例中,两者之间没有区别.

... deriving (A)
... deriving  A
Run Code Online (Sandbox Code Playgroud)

是完全相同的.正如您已经正确指出的那样,如果您要派生多个类,则必须使用括号.就个人而言,我总是包括括号,只是为了保持一致性.但它完全是一种风格选择,只要你保持一致,它就不重要了.


为了绝对完整,技术上有一种必要的情况.如果由于某种原因你有一个类型类,它是一个操作员名称,你需要提供括号以使其工作.

{-# 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
Run Code Online (Sandbox Code Playgroud)