Bu tür çıkarılırken “Sana Haskell Öğren” varsayımı nedir?


18

Bu soru öznel değil. Referans verilen kitapta çok spesifik bir fiil kullanılır ve bu ifadenin ne anlama geldiğini anlamak istiyorum, çünkü korkarım bir şeyi yanlış anlıyorum.

Dan You Bir Haskell bilgi , aşağıdaki paragraf "Biz varsayalım içeren üçüncü ve sonuncusu *".

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

Ve şimdi bunu bir örnek yapmak istiyoruz Functor. Functortür istiyor * -> *ama Barryböyle bir şeye benzemiyor. Nasıl bir şey Barry? Üç tür parametre gerektirdiğini görüyoruz, bu yüzden olacak something -> something -> something -> *. Bunun psomut bir tip olduğunu ve dolayısıyla bir çeşit olduğunu söylemek güvenlidir *. Çünkü k, varsayıyoruz *ve böylece uzantı tarafından t, bir tür vardır* -> * . Şimdi bu türleri somethingyer tutucu olarak kullandığımız s ile değiştirelim ve bunun bir tür olduğunu görüyoruz (* -> *) -> * -> * -> *.

Neden bir şey varsayıyoruz? "X'i varsayalım (yani X'in doğru olduğunu varsayalım)" ifadesini okuduktan sonra, X'in yanlış olduğunu da düşünmemiz gerektiğini düşünmek doğaldır. Örneğin belirli bir durumda, olamazdı ttür olması (* -> *) -> *ve ktürünün (* -> *)? Eğer durum buysa, her ne olsaydı tve kaslında, t ksomut bir tip olurdu, değil mi?

Tüm akıl yürütme çizgisinin derleyiciye göre kontrol edildiğini görüyorum, ancak derleyicinin varsaydığını düşünmüyorum . Eğer öyleyse, ne olduğunu bilmek isterim, eğer o zaman tekrar olmazsa korkarım paragrafın anlamını kaçırıyorum.


4
Haklısın. Gerçekten de, sürece k :: Lher türlü sahip olabiliriz . Ancak buradaki bir derleyici belirli bir seçim yapmalı veya bir çoklu türe başvurmalıdır. Bir çoklu tür en genel seçenek olacaktır, ancak burada GHC seçer (temel Haskell'in çoklu türleri yoktur, bir uzantı olarak açılması gerekir). Oldukça keyfi bir şey seçtiği için, LYAH "varsay" (AFAICT) kelimesini kullanır. Lt :: L -> *LL = *
chi

1
Tamam, belki derleyici beni en azından tahmin ettiğimizden daha az şaşkınlığa düşürürdü , ya da hiç şaşırmazdı .
Enrico Maria De Angelis

Yanıtlar:


19

Aslında, derleyici varsayıyor! Ancak bunu PolyKinds uzantısıyla yapmamasını isteyebilirsiniz. Burada daha ayrıntılı olarak okuyabilirsiniz . Bu uzantı açıldığında, bir tür Barryolacak forall k. (k -> *) -> k -> * -> *.


-1

İyi bir nokta. Yazar gereksiz bir varsayım yapar. Belki de sadece Type Foo bölümünde anlaşılmasını kolaylaştırmak için, ancak sizin gibi insanlar bunu haklı olarak sorgulayabilir.

Her ikisi tde kve ptip değişkenleridir. Gördüğümüz yabba :: pgibi, tek başına yaşayabildiğinden, sabit bir işlev gibidir, sanki bir tür yerine bir değermiş gibi, tür imzası söyleyebilir Intya da Charher neyse ... adını siz verirsiniz. Ama bir tür olduğu için imzası da öyle *.

Ancak tburadaki type k, bir type ( dabba :: t k) oluşturmak için bir type değişkeni alır, bu nedenle (burada varsayım yok) ttür imzası olduğu * -> *ve ksahip olduğuna eminiz* .

Bunu bildiğimizde ... tipin Barry t k pimzası, (* -> *) -> * -> * -> *o tzaman kve sonra pbize Barryyazın ve bu da bize yazın.

Düzenle @ luqui'nin yorumunu okuduğunuzdan emin olun.


7
k*çıkarılırken iddia ettiğiniz gibi kısıtlanmaz t. Biz olabilirdi k :: * -> *ve t :: (* -> *) -> *örneğin. Kayda bir alan ekleyin doo :: k Intve herhangi bir sorun olmadan geçecektir.
luqui

@luqui .. Evet haklısın ... Yorumun gerçekten ayakta durmaya değer olduğundan bu cevabı silmeyeceğim.
Redu
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.