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
.Functor
ingin jenis yang baik* -> *
tetapiBarry
tidak terlihat seperti itu. Jenis apa ituBarry
? Yah, kita lihat itu membutuhkan tiga tipe parameter, jadi itu akan menjadisomething -> something -> something -> *
. Aman untuk mengatakan bahwa itup
adalah jenis beton dan dengan demikian memiliki jenis*
. Karenak
, kami menganggap*
dan dengan ekstensi,t
memiliki semacam* -> *
. Sekarang mari kita ganti jenis-jenis itu dengansomething
huruf 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 t
dapat dari jenis (* -> *) -> *
dan k
jenis (* -> *)
? Jika ini masalahnya, apa pun t
dan k
sebenarnya, t k
masih 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.
k :: L
untuk jenis apa sajaL
, asalkant :: L -> *
. Namun seorang kompiler di sini harus memilih beberapa yang spesifikL
, atau menggunakan polkind. Polykind akan menjadi pilihan paling umum, tetapi di sini GHC memilihL = *
(Haskell dasar tidak memiliki polykind, mereka harus dinyalakan sebagai ekstensi). Karena ia memilih sesuatu yang agak sewenang-wenang, LYAH menggunakan kata "menganggap" (AFAICT).Jawaban:
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
Barry
akan seperti ituforall k. (k -> *) -> k -> * -> *
.sumber
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
,k
danp
merupakan variabel tipe. Seperti yang kita lihat dariyabba :: p
itu bisa hidup sendiri jadi itu seperti fungsi konstan, seolah-olah itu adalah nilai dan bukan tipe, itu tipe tanda tangan akan mengatakanInt
atauChar
, apa pun ... apa saja ... apa saja. Tapi karena itu adalah tipe maka jenis tanda tangan itu*
.Namun
t
tipe di sini mengambil variabel tipek
untuk membangun tipe (dabba :: t k
)jadi kami yakin bahwa (tidak ada asumsi di sini).t
memiliki tanda tangan jenis seperti* -> *
dank
telah*
Setelah kita mengetahui ini ...
Barry t k p
jenis tanda tangan jenis ini(* -> *) -> * -> * -> *
yang berarti diperlukant
kemudiank
dan kemudianp
memberi kitaBarry
ketik.Sunting Pastikan untuk membaca komentar @ luqui di bawah ini.
sumber
k
tidak dibatasi*
seperti yang Anda klaim saat disimpulkant
. Kita dapat memilikik :: * -> *
dant :: (* -> *) -> *
, misalnya. Tambahkan bidangdoo :: k Int
ke catatan dan itu akan berlalu tanpa masalah.