Pertanyaan Berasal dengan variabel tipe kinder lebih tinggi


Katakanlah saya memiliki tipe polimorfik di mana salah satu parameternya adalah tipe yang lebih tinggi (* -> *).

data Tricky m = Tricky { numbers :: m Int, genesis :: m String }

Apakah ada cara umum menurunkan contoh untuk jenis-jenis tersebut tanpa menggunakan ekstensi bahasa misterius dan tidak aman?

Saya mencoba mengaktifkan StandaloneDeriving sehingga saya bisa menentukan konteksnya:

deriving instance Show (m Int) => Show (Tricky m)

Tapi GHC kemudian mengeluh tentang kendala yang tidak lebih kecil dari kepala instance, dan mengarahkan saya ke arah UndecidableInstances.

Untuk meringkas:

1 Haruskah saya mengikuti saran ini, atau apakah ada cara yang lebih baik?

2 Apakah ada proposal untuk mempermudah proses ini?

3 Apakah entah bagaimana salah menuju ingin mendapatkan contoh 'yang lebih tinggi'? Akan lebih baik untuk mendapatkan contoh untuk beberapa jenis beton sebagai gantinya (mis. Vector, [], Set)


5
2017-09-30 16:55


asal


Jawaban:


1 Tidak ada yang tidak aman UndecidableInstances.

Ada cara lain untuk mendefinisikannya Show (Tricky m), yang membutuhkan m memuaskan forall a. Show a => Show (m a). Ini ditangkap oleh sebuah typeclass seperti

class Show1 f where
    showsPrec1 :: Show a => Int -> f a -> ShowS

Sebuah bahkan versi lebih pintar dari Show1 telah ditambahkan ke basis 4.9. Ini lebih umum karena dapat digunakan untuk menampilkan m a kapan a tidak memiliki Show a contoh.

2 Anda telah menemukan potongan dan potongan yang tepat untuk melakukan hal ini.

3 Tidak, itu benar menuju abstrak atas struktur bahkan lebih tinggi-kinded seperti Vector, [], dan Set. Transformator monad memiliki sejenisnya (* -> *) -> (* -> *) dan abstrak atas jenis yang sejenis (* -> *), jenis yang sama sebagai functor, untuk menghasilkan jenis dengan jenis yang sama sebagai functor. Tricky memiliki jenis (* -> *) -> *, dibutuhkan sesuatu dengan jenis yang sama sebagai functor dan menghasilkan tipe data biasa. Saya menyebut tipe data semacam ini "Model" karena mereka menghasilkan tipe data yang abstrak tentang bagaimana itu disatukan.


8
2017-09-30 18:04