我可以在派生显示中使 haskell GADT 数据构造函数中缀吗?
Can I make haskell GADT data constructor infix in derived Show?
考虑两个 data
声明:
{-# LANGUAGE GADTs #-}
data X = Int `Y` Int deriving Show
data Z where
W :: Int -> Int -> Z deriving Show
main = do
print (1 `Y` 2)
print (3 `W` 4)
运行 上述程序产生:
1 `Y` 2
W 3 4
所以派生的 show
知道 Y
是中缀并相应地打印它。 ::
语法似乎不允许中缀。
有什么方法可以让编译器将 W
的显示派生为中缀(除了为 Z
显式提供 show
实例)?
期望的输出是
1 `Y` 2
3 `W` 4
目前没有。 GADT 构造函数仅标记为中缀 under a specific set of conditions:
Note [Infix GADT constructors]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
We do not currently have syntax to declare an infix constructor in GADT syntax,
but it makes a (small) difference to the Show instance. So as a slightly
ad-hoc solution, we regard a GADT data constructor as infix if
a) it is an operator symbol
b) it has two arguments
c) there is a fixity declaration for it
For example:
infix 6 (:--:)
data T a where
(:--:) :: t1 -> t2 -> T Int
所以对于像W
这样的非符号构造函数,看起来你运气不好,但如果你愿意让它成为符号,你可以只添加一个固定性声明。
考虑两个 data
声明:
{-# LANGUAGE GADTs #-}
data X = Int `Y` Int deriving Show
data Z where
W :: Int -> Int -> Z deriving Show
main = do
print (1 `Y` 2)
print (3 `W` 4)
运行 上述程序产生:
1 `Y` 2
W 3 4
所以派生的 show
知道 Y
是中缀并相应地打印它。 ::
语法似乎不允许中缀。
有什么方法可以让编译器将 W
的显示派生为中缀(除了为 Z
显式提供 show
实例)?
期望的输出是
1 `Y` 2
3 `W` 4
目前没有。 GADT 构造函数仅标记为中缀 under a specific set of conditions:
Note [Infix GADT constructors] ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ We do not currently have syntax to declare an infix constructor in GADT syntax, but it makes a (small) difference to the Show instance. So as a slightly ad-hoc solution, we regard a GADT data constructor as infix if a) it is an operator symbol b) it has two arguments c) there is a fixity declaration for it For example: infix 6 (:--:) data T a where (:--:) :: t1 -> t2 -> T Int
所以对于像W
这样的非符号构造函数,看起来你运气不好,但如果你愿意让它成为符号,你可以只添加一个固定性声明。