Могу ли я сделать инфикс конструктора данных haskell GADT в производном шоу?

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

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

1 `Y` 2
3 `W` 4

person horsh    schedule 23.06.2017    source источник
comment
Я никогда не знал, что производителю Show можно указать напечатать несимволический инфикс конструктора.   -  person rampion    schedule 23.06.2017


Ответы (1)


Не сейчас. Конструкторы GADT помечаются как инфиксные только при определенных условиях. :

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)

person rampion    schedule 23.06.2017
comment
Возможно, а) следует отказаться? Если пользователь указал исправление, возможно, ожидается, что бинарный конструктор будет использоваться инфиксно, я думаю. - person chi; 24.06.2017