2010-06-10 10 views
12

System Clojure do tworzenia hierarchii ad hoc słów kluczowych jest znany większości ludzi, którzy spędzili trochę czasu z tym językiem. Na przykład, większość pokazy i prezentacje z języka obejmują przykłady takich jakKiedy i jak należy używać niezależnych hierarchii w clojure?

(derive ::child ::parent) 

i pokazać, w jaki sposób może to być wykorzystywane do wielu metod wysyłki idą dalej.

We wszystkich prezentacjach i slajdach, które widziałem, używają globalnej hierarchii. Ale możliwe jest umieszczanie relacji słów kluczowych w niezależnych hierarchiach za pomocą (wyprowadzić h :: child :: parent), gdzie h jest tworzone przez (make-hierarchy). W związku z tym niektóre pytania:

  • Czy istnieją jakieś wytyczne dotyczące tego, kiedy jest to przydatne lub konieczne?
  • Czy istnieją jakieś funkcje do manipulowania hierarchiami?

Łączenie jest szczególnie przydatna, więc mogę to zrobić:

(defn merge-h [& hierarchies] 
    (apply merge-with (cons #(merge-with clojure.set/union %1 %2) hierarchies)) 

Ale zastanawiałem się, czy takie funkcje już istnieją gdzieś.

EDIT: Zmieniono "niestandardową" hierarchię na "niezależną" hierarchię, ponieważ termin ten lepiej opisuje to zwierzę. Poza tym zrobiłem kilka badań i dodałem poniżej własną odpowiedź. Dalsze komentarze są mile widziane.

Odpowiedz

5

Mam zagłębił się tego problemu w ciągu ostatnich kilku dni, i myślę, że mam kilka odpowiedzi:

  1. funkcji używanych na niezależnych hierarchii mają różne semantykę od kiedy te same funkcje są stosowane w globalnej hierarchii . Wykonanie (wyprowadzenie kwd1 kwd2) powoduje efekt uboczny - wpis w globalnej hierarchii. Z drugiej strony (hierarchia wyprowadzania kwd1 kwd2) jest funkcjonalna - funkcja zwraca nową hierarchię, zamiast modyfikować var.
  2. Korzystanie z niezależnych hierarchii umożliwia posiadanie kilku różnych hierarchii dla tych samych słów kluczowych. Tak na przykład:

    (def koszykówka hierarchii (czerpać (make-hierarchia): Gretzky: Jordan))

    (def hokej-hierarchia (czerpać (make-hierarchia): Jordan: Gretzky))

Może to oznaczać, że: jordan jest wyższy w hierarchii koszykówki niż: gretzky, podczas gdy odwrotność jest prawdą w hierarchii hokejowej.

Ponadto: słowa kluczowe bez nazw może być umieszczane w niezależnych hierarchiach, ale nie w globalnej hierarchii. Więc

(derive (make-hierarchy) :a :b) 

będzie działać, ale dla globalnej hierarchii, te słowa będą musiały być w przestrzeni nazw:

(derive :nspace/a :nspace/b) 

gdzie nspace pewne nazw. (Ta przestrzeń nazw w rzeczywistości nie musi być zadeklarowana nigdzie, co ciekawe.)

Podsumowując, należy użyć niezależnych hierarchii, gdy potrzebna jest więcej niż jedna hierarchia lub gdy hierarchia wymaga dużej modyfikacji w czasie wykonywania. Ponadto, jeśli potrzebujemy hierarchii dla nagich słów kluczowych, wymagana jest niezależna hierarchia.

+0

Jedną z obaw dotyczących przykładu sportowego jest: (isa? Hockey-hierarchy: jordan: gretzky) => true. tj. są to hierarchie typów. Ale punkt jest ważny: te same słowa mogą być różnymi typami w różnych typach relacji w różnych domenach, co wymaga lokalnej hierarchii. W rzeczywistości jestem zaskoczony, że możemy mieszać się w globalną hierarchię. – kennytilton

Powiązane problemy