我可以在派生显示中使 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这样的非符号构造函数,看起来你运气不好,但如果你愿意让它成为符号,你可以只添加一个固定性声明。

(向 this template haskell bug thread 致敬)