OCaml

2010-08-05 12 views
8

içinde arayüz olarak funktörler kullanıyorum OCaml'de bazı parçaların "takılabilir" olması için ihtiyaç duyduğu bazı algoritmalar geliştiriyorum, böylece hesaplamanın bir kısmı belirli bilgisayar üreticilerine bırakılmıştır. Alg1 ve Alg2 olacakOCaml

module type Algorithm = sig 
    val feed : float -> unit 
    val nth : int -> (float -> float) 
end 

Ve iki farklı uygulamaları:

Sadece bir örnek yapmaya bunun gibi bir imza olduğunu varsayalım. Bu Algorithm modülü, bu iki gibi çeşitli uygulamalar için arabirimi temsil etmelidir.

Şimdi başka bir bileşen ihtiyaç

functors hakkında okuma ben bir Algorithm alır ve üreten bir functor gerektiğinde görünüyor .. en Alg1 veya bunların arayüzünde düşünce Alg2 kullanan modül olacağını Executor diyelim İhtiyacım olan algoritmanın özel bir uygulaması ile bir ConcreteExecutor. Bu nedenle, Executor, bileşenlerinden biri üzerinde parametrize edilen bir çeşit modüldür ..

Doğru muyum? İhtiyacım olanı elde etmenin en iyi yolu bu mu? Bunun gibi düşünenleri merak ediyorum çünkü bir Java/C++ arka planından geliyorum, bu yüzden arayüzleri ve soyut sınıfları kullanıyorum ve bu functor/modül soyutlama konusuna doğru şekilde girmem gerekiyor.

Ne istediğimi elde etmek için doğru sözdizimi hangisidir?

+2

Bu gerçekten çok eğlenceli bir şekilde kullanılmaktadır. Onları bir labirent nesil uygulamasında kullanıyorum. Bir algoritma ve labirent temsili takın ve siz de kapalısınız. Hala SVG, GraphViz, PDF ve PNG'yi destekleyen başka bir functor olabilecek çıktı üzerinde çalışıyor. – nlucaroni

+1

@nlucaroni - labirent oluşturma uygulamanızın herhangi bir yerinde mevcut olan koddur. – aneccodeal

cevap

4

Ya, buna functors gibi geliyor önceden

sayesinde istediğiniz şeylerdir. Aslında, kaynak kodun kullanılabilir olması nedeniyle standart kitaplığın functor'ları nasıl kullandığını gözden geçirebilirsiniz. Makinemde /usr/lib/ocaml/3.10.2/ adresinde bulunur.

module type OrderedType = 
    sig 
    type t 
    val compare : t -> t -> int 
    end 

module type S 
    sig 
    ... 
    end 

module Make (Ord : OrderedType) : S with type elt = Ord.t 

yapmanız OCaml bir dizi kullanmak istiyorum:: En koduyla Yani

module SSet = Set.Make(String);; 

, Algoritma OrderedType yerini Alg1/Alg2 yerini Örnek olarak, set.mli aşağıdakileri içerir String, Executor, Make'in yerini alır ve ConcreteExecutor, Executor'ın (Alg1/Alg2) sonucudur. Ayrıca, string.mli/ml'nin OrderedType öğesinin sözünü içermediğini de fark edeceksiniz. String, bir işlev karşılaştırması tarafından kullanılan bir t türüne sahip olması nedeniyle bir OrderedType'tır. Açıkça String'in bir OrderedType olduğunu söylemeniz gerekmez.

+0

Ocaml'i güncellemeniz gerekiyor. :) – nlucaroni

+0

Ha! Kök erişime sahip olmayan bir makinenin sürümü. Evimdeki makinem daha günceldir (Debian'ın 3.12 değerini ne zaman alacağını kim bilebilir?). –

+0

Biraz zaman alabilir, ancak OCaml sürümleri arasındaki uyumsuzluğun gecikmelerden sorumlu olduğunu biliyorsunuz, değil mi? Debian "OCaml muhafızları", Debian'daki tüm OCaml paketlerinin yeni sürümle derlendiğinden emin olmalı ve hepsini bir seferde değiştirecek. Harika bir iş yapıyorlar ve bu onların suçu değil. –