Pertanyaan Bisakah saya membuat haskell GADT data constructor infix di turunan Show?


Pertimbangkan dua data deklarasi:

{-# 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)

Menjalankan program di atas menghasilkan:

1 `Y` 2
W 3 4

jadi yang diturunkan show tahu itu Y adalah infix dan mencetaknya sesuai. Itu :: sintaks tampaknya tidak memungkinkan infixness.

Apakah ada cara untuk membuat acara kompiler berasal untuk W sebagai infix, (selain secara eksplisit menyediakan show contoh untuk Z)? Output yang diinginkan adalah

1 `Y` 2
3 `W` 4

13
2018-06-23 20:08


asal


Jawaban:


Tidak saat ini. Kontraktor GADT hanya ditandai sebagai infix di bawah satu set kondisi tertentu:

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

Jadi untuk konstruktor non-simbolik seperti W, sepertinya Anda kurang beruntung, tetapi jika Anda bersedia menjadikannya simbolik, Anda bisa menambahkan pernyataan ketetapan.

(ujung topi ke template ini memiliki bug thread)


13
2018-06-23 20:45