ı seçenekler listesi var diyelim:OCaml: Yüksek kinded polimorfizmi (modülleri üzerinde abstracting?)
let opts = [Some 1; None; Some 4]
Ben, listenin bir seçenek haline bu dönüştürmek istiyorsanız, öyle ki:
- Liste
None
içeriyorsa, sonuçNone
- Aksi takdirde, çeşitli mürekkepler toplanır. Gerçekten tip üzerinde soyut istiyorum, soru başlık da anlaşılacağı gibi,
let sequence foo = let open Option in let open Monad_infix in List.fold ~init:(return []) ~f:(fun acc x -> acc >>= fun acc' -> x >>= fun x' -> return (x' :: acc') ) foo;;
Ancak:
O (Core kullanarak ve Monad
modülü) bu özel durum için bu yazmak için nispeten basittir Option
uzmanlaşmak yerine kurucu. Çekirdek, daha iyi bir türün etkisini vermek için bir functor kullanıyor gibi görünüyor, ancak modül üzerinde soyutlanacak fonksiyonu nasıl yazabileceğimi açıklamıyorum. Scala'da, bazı Monad[M[_]]
'un kullanılabilirliğini gerektiren örtük bir bağlam kullanacağım. Modülden örtülü olarak geçmenin bir yolu olmadığını umuyorum, ama bunu açıkça nasıl yaparım? Başka bir deyişle, yaklaşık olarak bir şey yazabilir miyim:
Bu, birinci sınıf modüller ile yapılabilecek bir şey mi?
Düzenleme: Tamam, aslında bu özel kodu kullanarak denemek için bana oluşmaz bu yüzden ve bunun Beklediğimden daha çalışmaya daha yakın görünür! Görünüşe sözdizimi aslında geçerlidir, ancak bu sonucu elde:
Error: This expression has type 'a M.t but an expression was expected of type 'a M.t
The type constructor M.t would escape its scope
hatasının ilk bölümü Eşleştiklerinden beri kafa karıştırıcı gibi görünüyor, bu yüzden sorunu tahmin ediyorum ikinci ile - burada sorun var mı dönüş tipi belirlenmemiş gibi görünüyor? Sanırım içeri aktarılan modüle bağlı - bu bir problem mi? Bu uygulamayı düzeltmenin bir yolu var mı?
Bu eski soru sizin için yararlı olabilir: http://stackoverflow.com/questions/1986374/higher-order-type-constructors-and-functors-in-ocaml – rgrinberg