Можно ли сделать инфикс-конструктор данных haskell GADT в производном 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 как инфикс (кроме явного предоставления show экземпляр для Z)? Желаемый результат

1 `Y` 2
3 `W` 4

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)

Другие вопросы по тегам