2009-10-26 12 views
9

Dowiedziałem się sporo schematu z SICP, ale teraz jestem bardziej zainteresowany wspólnym seplenieniem. Wiem, że typowe seplenienie fold jest reduce, ze specjalnymi argumentami dla lewego lub prawego składania, ale co jest odpowiednikiem unfold? Googling nie pomógł wiele. W rzeczywistości mam wrażenie, że się nie rozwinęło ???"Rozwiń" dla wspólnego seplenienia?

Odpowiedz

13

Common Lisp ma (loop ... collect ...). Porównaj

 
(loop for x from 1 to 10 collect (* x x)) 

z jej równoważność za pomocą unfold:

 
(unfold (lambda (x) (> x 10)) 
    (lambda (x) (* x x)) 
    (lambda (x) (+ x 1)) 
    1) 

Ogólnie (unfold p f g seed) jest w zasadzie

 
(loop for x = seed then (g x) until (p x) collect (f x)) 

Edit: literówka naprawić

+2

Hmm, to interesujące. Przez ostatnią godzinę bawiłem się z pętlą: P to świetne rzeczy! Uwielbiam, gdy języki programowania mają te małe wbudowane podhasła, które mają własną składnię i zbiór reguł do zrozumienia, takich jak ciągi formatów. Pętla to potężne rzeczy! – nullpointer

+2

Witaj w ciemnej stronie. – huaiyuan

3

Zwykłe hiperpecki lisp nie definiuje funkcji unfold, ale z pewnością możesz napisać własną. Jego definicja schematu tłumaczy prawie symbol dla symbolu.

+3

Dzięki. To niefortunne, ale przypuszczam, że napiszę własne. Naprawdę lubię schemat bycia tak czystym i posiadającym tak piękną, funkcjonalną dobroć, ale w pewnym sensie zrezygnowałem z nauki splątanego, ale ekspresyjnego wspólnego seplenienia. To trochę jak nauka angielskiego, a nie esperanto, wiesz? – nullpointer