İdris

2014-04-05 14 views
29
sıralamasını-n kantifikasyonunu Doing

Ben sadece oldukça hantal bir şekilde İdris 0.9.12 sıralamasını-n türlerini yapabilirsiniz: İdris ayrıştırmak atar çünküİdris

tupleId : ((a : Type) -> a -> a) -> (a, b) -> (a, b) 
tupleId f (a, b) = (f _ a, f _ b) 

Ben, bir tür uygulama var her yerde çizgi ihtiyaç

tupleId : ({a : Type} -> a -> a) -> (a, b) -> (a, b) -- doesn't compile 

bir olasılıkla daha büyük bir sorun ben hiç yüksek rütbe türlerinde sınıf kısıtlamaları yapamaz şudur: hatalar ı (iç içe) yapmak örtülü argümanları yazmaya çalıştığınızda. Ben İdris'e aşağıdaki Haskell işlevi tercüme edemez:

appShow :: Show a => (forall a. Show a => a -> String) -> a -> String 
appShow show x = show x 

Bu aynı zamanda Haskell Lens s t a b = forall f. Functor f => (a -> f b) -> s -> f t olduğu Lens gibi türleri için tip eş anlamlı olarak İdris fonksiyonlarını kullanarak engelleyen.

giderilmesi veya yukarıdaki sorunları aşmak için herhangi bir şekilde?

+14

Benim YAPILACAKLAR listemde var ... sonunda bu konuda bir şeyler yapacağız. Şaşırtıcı bir şekilde, bunun için çok fazla talep olmamıştı, açıkçası güzel olurdu. örtülü argümanlar doğru almakla bazı trickiness yoktur, bu yüzden şimdilik oldukça basit bir yaklaşım aldık. Tipi sınıfları birinci sınıf, bu nedenle sınıf kısıtlamaları yapmak için hantal bir yol da var - Normal işlev parametresi olarak onları tedavi ve açıkça örneğini bulmak için '% örneğini kullanabilirsiniz. –

+0

@EdwinBrady teşekkürler, bunu bir cevap olarak kabul ediyorum (ya da öyle bir cevap verdim). –

+0

Henüz uygun bir cevap gibi gelmiyor ... Umarım yakında size geri döneceğim! Benim [google grubuna soruya] bir –

cevap

18

Sadece keyfi kapsamları içinde implicits sağlayan usta bu uyguladık ve bir sonraki hackage sürümde olacak. Yine de iyi test edilmedi!

appShow : Show a => ({b : _} -> Show b => b -> String) -> a -> String 
appShow s x = s x 

AppendType : Type 
AppendType = {a, n, m : _} -> Vect n a -> Vect m a -> Vect (n + m) a 

append : AppendType 
append [] ys = ys 
append (x :: xs) ys = x :: append xs ys 

tupleId : ({a : _} -> a -> a) -> (a, b) -> (a, b) 
tupleId f (a, b) = (f a, f b) 

Proxy : Type -> Type -> Type -> Type -> (Type -> Type) -> Type -> Type 

Producer' : Type -> (Type -> Type) -> Type -> Type 
Producer' a m t = {x', x : _} -> Proxy x' x() a m t 

yield : Monad m => a -> Producer' a m() 

dakikada ana kısıt Üst düzeyde dışında doğrudan örtülü argümanlar için değerleri veremez ki: Ben en azından aşağıdaki basit örnekler, ve birkaç başka çalıştılar. başkası bu yüzden sadece bu :) sorunu düzeltmenin bir yolu soran onlar hakkında sorarsa normalde şeyler YAPILACAK listesini hareket - Ben

+1

Tür sınıfları da mı olacak? – dfeuer