Когда мы должны ставить скобки после получения?
Я вижу два выражения
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