Apakah ada perbedaan antara tanda tangan jenis a -> b -> a dan c -> a -> c?

16

Pertanyaan ini adalah pertanyaan teoretis tentang fungsi Haskell yang dapat mengambil argumen apa pun. Apakah ada perbedaan antara fungsi cara dengan jenis tanda tangan

a -> b -> a 

dan

c -> a -> c 

Apakah instantiated? Bantuan apa pun dihargai.

Dreana
sumber
6
Tidak, Anda cukup mengubah nama variabel tipe . Selama Anda tidak mengganti nama variabel ke variabel lain (sedemikian rupa sehingga ada bentrokan nama), tidak ada masalah.
Willem Van Onsem
Tergantung pada apakah / bagaimana variabel tipe terikat di tempat lain.
Bergi

Jawaban:

17

Tidak ada perbedaan. Sejak a, bdan cmulai dengan huruf kecil , ini adalah variabel . Anda bisa mengganti nama variabel, dan ini tetap sama, selama dua (atau lebih) variabel tidak " berselisih ".

Bentrokan semacam itu dapat terjadi jika Anda mengubah nama variabel sehingga memiliki nama yang sama dengan variabel lain, atau ketika Anda mengganti nama dua (atau lebih) variabel menjadi nama baru yang sama. Jika Anda akan mengganti nama variabel amisalnya menjadi bdalam fragmen kode pertama Anda, maka kami akan mendapatkannya b -> b -> b, tetapi itu tidak sama, karena kami menegakkan bahwa parameter pertama dan kedua adalah dari jenis yang sama. Sedangkan dalam tanda tangan tipe Anda, kami memiliki kebebasan untuk memilih dua jenis yang bisa sama, tetapi itu tidak perlu.

Willem Van Onsem
sumber
16

Nggak. Pikirkan a -> b -> asebagai This Type -> Another Type -> This Type. Kemudian keduanya cocok dengan pola yang diberikan. Namun, sesuatu seperti a -> b -> ctidak cocok: This Type -> That Type -> Yet Another Type(umumnya) berbeda; kecuali kasing tepi saat c = a, yang menghasilkan pola yang Anda minati.

Sereja Bogolubov
sumber