2016-09-10 14 views
5

Ocaml'da'u takip eden ücretsiz bir kitap kütüphanesi yazmaya çalışıyorum ama bir noktada, hoistFree uygulamasında takılıyorum.Ocaml'deki genişletme türleri

hoistFree :: Functor g => (forall a. f a -> g a) -> Free f b -> Free g b 
hoistFree _ (Pure a) = Pure a 
hoistFree f (Free as) = Free (hoistFree f <$> f as) 

İşte bir çeviri girişimi.

let rec hoistfree : 'b.('b t -> 'b t) -> 'a m -> 'a m = 
     fun f x -> match x with 
     | Return x -> Return x 
     | Free x -> Free (T.map (hoistfree f) (f x));; 

Maalesef, doğru şekilde g türünü genişletmediğimi bildiren bir hatayla karşılaşıyorum. Ben fonksiyon tipi açıklama eklemeye yok, ama o zaman hata mesajı söylediği gibi, ben f için genel türünü alamazsanız

Error: This definition has type ('b m t -> 'b m t) -> 'b m -> 'b m 
     which is less general than 'a. ('a t -> 'a t) -> 'b m -> 'b m 

Her şey iyi çalışır. Sorun nerede? F türünü nasıl genişletebilirim?

cevap

3

Ben ocaml ile çok aşina değilim ama eski temel polimorfik türüdür

let rec hoistfree : ('b. ('b t -> 'b t)) -> 'a m -> 'a m = 

let rec hoistfree : 'b. (('b t -> 'b t) -> 'a m -> 'a m) = 

yerine

olarak

let rec hoistfree : 'b.('b t -> 'b t) -> 'a m -> 'a m = 

ayrıştırılır inanıyoruz, ikincisi, tip sisteminden Hindley-Milner'a göre daha fazla destek gerektiren bir rank2 türüdür.

IIRC, ikincisini elde etmek için özel bir sarıcı veri türü tanımlamanız gerekir. Örneğin, cevabınız için teşekkürler:

+0

Teşekkürler. Fikrimi özel ortamımda uygulamaya çalışıyorum. – stackman