2011-07-05 24 views
5

Jak Erlang jest prawie czysty język programowania funkcjonalne, bym sobie wyobrazić to było możliwe:Erlang wzorzec dopasowania z funkcji

case X of 
    foo(Z) -> ... 
end. 

gdzie foo(Z) jest rozstrzygalne-odwracalna czystego (efektem ubocznym darmo) bijective funkcja, np:

foo(input) -> output. 

Następnie, w przypadku, X = output, Z pasowałby jako input.

Czy możliwe jest użycie takiej semantyki, z lub bez innej składni niż mój przykład, w Erlangu?

Odpowiedz

1

Nie, Erlang obsługuje tylko dosłowne wzory!

Twoja pierwotna prośba nie jest łatwa. Tylko dlatego, że istnieje odwrotność, nie oznacza, że ​​łatwo ją znaleźć. Praktycznie byłoby tak, że kompilator musiałby tworzyć dwie wersje funkcji.

4

Nie, tego, czego chcesz, nie jest możliwe.

Aby zrobić coś takiego, musiałbyś być w stanie znaleźć odwrotność dowolnej funkcji bijective, która jest oczywiście nierozstrzygalna.

+3

@Pindatjuh: Wiem, co to jest funkcja bijective. Ale tylko dlatego, że każda funkcja bijective ma odwrotność, nie oznacza, że ​​można napisać algorytm, aby ją znaleźć (nie można). – sepp2k

+0

Będę edytować pytanie: funkcja odwracalnego czystego bijective. – Pindatjuh

2

Domyślam się, że nie jest to dozwolone, ponieważ chcesz zagwarantować brak efektów ubocznych. Biorąc pod uwagę następującą strukturę:

case Expr of 
    Pattern1 [when GuardSeq1] -> 
     Body1; 
    ...; 
    PatternN [when GuardSeqN] -> 
     BodyN 
end 

Po ocenić Expr, wzorce są kolejno porównywane wyniku Expr. Wyobraź sobie funkcja foo/1 zawiera działania niepożądane (np wysyła wiadomość):

foo(input) -> 
    some_process ! some_msg, 
    output. 

Nawet jeśli pierwszy wzór nie pasuje, byś wysłał wiadomość i tak nie można było odzyskać z tej sytuacji.

+0

Dzięki, ale miałem na myśli "czystą funkcję", że nie wolno mieć efektów ubocznych. Będę edytować pytanie. – Pindatjuh

+1

Rozumiem to. Problem jednak polega na zapewnieniu, że funkcja jest czysta, gdy jest zdefiniowana przez użytkownika. –

1

Co można zrobić, to:

Y = foo(Z), 
case X of 
    Y -> ... 
end. 
+2

Wymaga to znajomości wartości Z. Jestem prawie pewien, że nie to zamierzał PO. – sepp2k

+0

Cóż, jeśli zamieniamy 'foo' na' foo_inverse', ma to sens. Jednak, jak powiedział sepp2k, nie to zamierzałem. – Pindatjuh

Powiązane problemy