Подтвердить что ты не робот

Могу ли я сделать haskell GADT data constructor infix в производном 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 является infix и печатает его соответствующим образом. Синтаксис ::, похоже, не позволяет инфиксности.

Есть ли способ сделать вывод компилятора show для W как infix (кроме явного предоставления экземпляра show для Z)? Желаемый результат:

1 `Y` 2
3 `W` 4
4b9b3361

Ответ 1

В настоящее время нет. Конструкторы GADT помечены как infix в соответствии с определенным набором условий:

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, похоже, что вам не повезло, но если вы хотите сделать его символическим, вы можете просто добавить объявление о фиксации.

(подсказка шляпы к этот шаблон ошибки haskell)