Когда мы должны ставить скобки после получения?

Я вижу два выражения

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

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

Я сбиваю с толку, когда я должен использовать скобки после получения. Я знаю, что мы должны использовать круглые скобки и запятые, если есть более одного класса.

1 ответ

Решение

В каждом разумном случае нет различий между ними.

... 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
Другие вопросы по тегам