推导后什么时候加括号?
When should we put parenthesis after deriving?
我看到两个表情
data BinTree a = BTNil | BTNode a (BinTree a) (BinTree a) deriving Show
data Day = Sunday | Monday | Tuesday | Wednesday
| Thursday | Friday | Saturday deriving (Enum)
我很困惑什么时候应该在推导后使用括号。我知道我们应该在有多个 类.
的地方使用括号和逗号
在每个合理的用例中,两者之间没有区别。
... 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
我看到两个表情
data BinTree a = BTNil | BTNode a (BinTree a) (BinTree a) deriving Show
data Day = Sunday | Monday | Tuesday | Wednesday
| Thursday | Friday | Saturday deriving (Enum)
我很困惑什么时候应该在推导后使用括号。我知道我们应该在有多个 类.
的地方使用括号和逗号在每个合理的用例中,两者之间没有区别。
... 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