Можно ли сделать инфикс-конструктор данных 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)