2016-06-14 21 views
15

'a bildirilmesi Reverse :: [k] -> [k] türünde bir aile ise, Haskell bunu (Reverse (Reverse xs)) ~ xs numaralı telefondan söyleyemez. Türü sistemin herhangi bir çalışma zamanı maliyeti olmadan bunu bilmesinin bir yolu var mı?Haskell'in (Geri (Geri xs)) xs`

Sadece unsafeCoerce'u kullanıyorum ama utanılacak gibi görünüyor. Ghc içinde ~ davranışını etkilemek için Bildiğim

+4

AFAICS, şu anda bunu yapmak için hiçbir şekilde. Bu yüzden GHC'yi bir günde bir sonlandırma denetleyicisine entegre etmeyi ve 'T' tam olarak bir tane hata kodu yapıcısı olduğunda 'x :: T' 'yi x = unsafeCoerce()' ye dönüştürebilir. : ~: 'yapar. Birinin indüksiyonla bir kanıt yazması gerekiyor, ama en azından çalışma zamanı cezası verilmiyor. – chi

+5

Bir noktada, aslında bu tür şeyler için tasarlanan bir dili kullanmak daha pratik olmalı ... –

cevap

1

tek yolu aslında a :~: b bir örneğini oluşturmak için (veya benzer; önemli olan bir bu typechecker için "kanıtlıyor" terimini oluşturmaktır) sonra ve Çalışma zamanında kanıt tanığının değerlendirilmesini gerektiren Refl yapıcısında desen eşleşmesi. Benim anlayışım, GHC'deki bağımlı tipler için mevcut tasarımın hala tüm tipte eşitlik kanıtlarını çalıştırması gerekliliğidir. Bununla birlikte, bir kişi, yazım denetiminden sonra, kanıt tanığını çok düşük maliyetli bir işlevle (örneğin, unsafeCoerce Refl :: Reverse (Reverse a) :~: a) değiştirebilir, bu da değerlendirmeyi çok düşük maliyetle yapar, ancak yine de güvenlidir (kanıt tanıklığı daha önce yazıldığından, eğer sona ererse, doğru bir kanıt üretecektir). Haskell bağımlı yazarak mevcut durumu hakkında

Çok daha fazla bilgi burada bulunabilir: https://typesandkinds.wordpress.com/2016/07/24/dependent-types-in-haskell-progress-report/