Bunu kanıtlamak λ x. Ram ≠ Ω, Abramsky'nin tembel lambda kalkülüs teorisi ( Uday Reddy tarafından alıntılanan makalesinin 2. sayfası) için belirlediği hedeflerden biridir , çünkü ikisi de zayıf kafa normal formundadır. Tanım 2.7 itibariyle, açıkça eta indirgeme λ x tartışıyor. M x → M genellikle geçerli değildir, ancak M her ortamda sona ererse mümkündür. Bu, M'nin toplam bir işlev olması gerektiği anlamına gelmez - yalnızca M'yi değerlendirmenin sona erdirilmesi gerektiği anlamına gelir (örneğin bir lambdaya indirgeyerek).
Sorunuz pratik kaygılarla (performans) motive olmuş gibi görünüyor. Ancak, Haskell Raporu tamamen net olmasa da, λ x eşitliğinden şüpheliyim. ile ⊥ Haskell'in faydalı bir uygulamasını üretecektir; Haskell '98'i uygulasın ya da uygulamasın tartışmalı olsa da, söze göre, yazarların durumun böyle olmasını istediği açıktır.
Son olarak, rastgele bir girdi türü için elemanlar nasıl oluşturulur? (QuickCheck'in bunun için Keyfi tip sınıfını tanımladığını biliyorum, ancak bu tür kısıtlamaları buraya eklemenize izin verilmiyor). Bu parametrikliği ihlal eder.
Güncellendi : Bu hakkı kodlamayı başaramadım (çünkü Haskel'de çok akıcı değilim) ve bunu düzeltmek iç içe runST
bölgeler gerektiriyor gibi görünüyor . Bu tür keyfi öğeleri kaydetmek, daha sonra okumak ve evrensel olarak kullanılabilir hale getirmek için tek bir referans hücresi (ST monad'da) kullanmayı denedim. Parametriklik break_parametricity
, önerilen seq'in üreteceği öğeleri kurtarabilirken, aşağıda tanımlanamayacağını (altta döndürme, örneğin bir hata hariç) kanıtlar .
import Control.Monad.ST
import Data.STRef
import Data.Maybe
produce_maybe_a :: Maybe a
produce_maybe_a = runST $ do { cell <- newSTRef Nothing; (\x -> writeSTRef cell (Just x) >> return x) `seq` (readSTRef cell) }
break_parametricity :: a
break_parametricity = fromJust produce_maybe_a
İtiraf etmeliyim ki burada gerekli olan parametrik kanıtın resmileştirilmesinde biraz bulanıkım, ama parametrikliğin gayri resmi kullanımı Haskell'de standart; ama Derek Dreyer'in yazılarından, gerekli teorinin bu son yıllarda hızla çözüldüğünü öğrendim.
düzenlemeler:
- ML benzeri, zorunlu ve türlenmemiş diller için incelenen bu uzantılara ihtiyacınız olup olmadığından veya klasik parametrik teorilerinin Haskell'i kapsadığından emin değilim.
- Ayrıca, Derek Dreyer'den bahsetmiştim, çünkü daha sonra sadece Uday Reddy'nin çalışmasına rastladım - sadece son zamanlarda "Reynolds'ın özü" nden öğrendim. (Parametriklik ile ilgili literatürü sadece son bir ayda okumaya başladım).