Apa asumsi yang dibuat dalam "Learn You a Haskell" ketika menyimpulkan jenis itu?

18

Pertanyaan ini tidak subyektif. Kata kerja yang sangat spesifik digunakan dalam buku yang direferensikan, dan saya ingin memahami apa implikasi dari ungkapan itu, karena saya khawatir saya salah memahami sesuatu.

Dari Learn You a Haskell , paragraf berikut adalah paragraf ketiga dan terakhir yang mengandung "kami berasumsi *".

data Barry t k p = Barry { yabba :: p, dabba :: t k }  

Dan sekarang kami ingin menjadikannya sebagai contoh Functor. Functoringin jenis yang baik * -> *tetapi Barrytidak terlihat seperti itu. Jenis apa itu Barry? Yah, kita lihat itu membutuhkan tiga tipe parameter, jadi itu akan menjadi something -> something -> something -> *. Aman untuk mengatakan bahwa itu padalah jenis beton dan dengan demikian memiliki jenis *. Karena k, kami menganggap *dan dengan ekstensi, tmemiliki semacam* -> * . Sekarang mari kita ganti jenis-jenis itu dengan somethinghuruf yang kita gunakan sebagai placeholder dan kita lihat ada jenisnya (* -> *) -> * -> * -> *.

Mengapa kita mengasumsikan sesuatu sama sekali? Setelah membaca "kita menganggap X (yaitu kita menganggap bahwa X adalah benar)" adalah wajar bagi saya untuk berpikir bahwa kita juga harus mempertimbangkan kasus bahwa X salah. Dalam kasus spesifik dari contoh, tidak tdapat dari jenis (* -> *) -> *dan kjenis (* -> *)? Jika ini masalahnya, apa pun tdan ksebenarnya, t kmasih akan menjadi tipe yang konkret, bukan?

Saya melihat bahwa seluruh garis penalaran kemudian diperiksa terhadap kompiler, tetapi saya tidak berpikir kompilator mengasumsikan . Jika ya, saya ingin tahu apa, jika tidak lagi saya khawatir saya kehilangan makna paragraf.

Enrico Maria De Angelis
sumber
4
Anda benar. Memang bisa kita miliki k :: Luntuk jenis apa saja L, asalkan t :: L -> *. Namun seorang kompiler di sini harus memilih beberapa yang spesifik L, atau menggunakan polkind. Polykind akan menjadi pilihan paling umum, tetapi di sini GHC memilih L = *(Haskell dasar tidak memiliki polykind, mereka harus dinyalakan sebagai ekstensi). Karena ia memilih sesuatu yang agak sewenang-wenang, LYAH menggunakan kata "menganggap" (AFAICT).
chi
1
Ok, mungkin kompiler mengasumsikan akan membingungkan saya setidaknya kurang dari yang kita duga , atau tidak sama sekali.
Enrico Maria De Angelis

Jawaban:

19

Bahkan, kompilator tidak berasumsi! Tapi Anda bisa memintanya untuk tidak menggunakan ekstensi PolyKinds. Anda dapat membacanya lebih detail di sini . Dengan ekstensi itu diaktifkan, jenisnya Barryakan seperti itu forall k. (k -> *) -> k -> * -> *.

Daniel Wagner
sumber
-1

Poin yang bagus. Penulis membuat asumsi yang tidak perlu. Mungkin hanya untuk membuatnya lebih mudah dimengerti dalam bab Type Foo-nya, tetapi orang-orang seperti Anda berhak mempertanyakan hal ini.

Keduanya t, kdan pmerupakan variabel tipe. Seperti yang kita lihat dari yabba :: pitu bisa hidup sendiri jadi itu seperti fungsi konstan, seolah-olah itu adalah nilai dan bukan tipe, itu tipe tanda tangan akan mengatakan Intatau Char, apa pun ... apa saja ... apa saja. Tapi karena itu adalah tipe maka jenis tanda tangan itu *.

Namun ttipe di sini mengambil variabel tipe kuntuk membangun tipe ( dabba :: t k) jadi kami yakin bahwa (tidak ada asumsi di sini) tmemiliki tanda tangan jenis seperti * -> *dan ktelah* .

Setelah kita mengetahui ini ... Barry t k pjenis tanda tangan jenis ini (* -> *) -> * -> * -> *yang berarti diperlukan tkemudian kdan kemudian pmemberi kita Barryketik.

Sunting Pastikan untuk membaca komentar @ luqui di bawah ini.

Redu
sumber
7
ktidak dibatasi *seperti yang Anda klaim saat disimpulkan t. Kita dapat memiliki k :: * -> *dan t :: (* -> *) -> *, misalnya. Tambahkan bidang doo :: k Intke catatan dan itu akan berlalu tanpa masalah.
luqui
@luqui .. Ya Anda benar ... Saya tidak akan menghapus jawaban ini karena komentar Anda benar-benar layak.
Redu