2015-07-12 29 views
19

Haskell łączy swoje funkcje. Clojure nie pozwala jednak na makra funkcyjne jako porównywalne podejście do robienia tego samego.Dlaczego Rich Hickey nie obsługuje automatycznie funkcji Clojure?

Wydaje mi się, że przypomniałem sobie o przesłuchaniu/odczytaniu przyczyny decyzji Hickeya. Czy ktoś przypomina sobie, czym był ten powód lub gdzie mogłem go znaleźć?

Miałem nadzieję, że dowiem się czegoś z uzasadnienia.

+1

Zakładam, że przynajmniej część przyczyny jest taka, że ​​Clojure nie jest w 100% leniwy i aplikacja nie może zostać odroczona. –

+3

Twoje pierwsze zdanie nie jest dokładne. Haskell curry * wszystkie * funkcje, bez względu na liczbę dostarczonych argumentów. W rzeczywistości wszystkie funkcje Haskell pobierają jedno wejście i zwracają jedno wyjście. https://wiki.haskell.org/Currying https://wiki.haskell.org/Composing_functions_with_multiple_values. W Haskell funkcja ** uncurry ** w rzeczywistości nie jest nieprzewidywalna; zamiast tego zajmuje pierwsze dwie funkcje w łańcuchu i składa je w jedną funkcję, która pobiera ** parę ** jako pojedyncze wejście. – itsbruce

+3

hołd złożony Haskell Curry. – rem

Odpowiedz

26

Ponieważ funkcje mogą mieć wiele rzędów, można uzyskać bezpośrednie wywołanie funkcji zamiast funkcji currying. Następnie, jeśli masz tylko jedną arytę i brakuje ci argumentu, błąd arity nie zostanie wykryty i zamiast tego wygenerujesz funkcję currying. Bardzo zły i trudny przypadek do debugowania, szczególnie jeśli funkcja zwraca funkcję o tej samej zadanej wartości lub jeśli funkcja jest przekazywana jako argument do innej funkcji.

Tak więc tworzenie funkcji curry wydaje się być uzasadnione.

+3

Pracowałem nad trochę zainspirowanym Clojure code i próbując sprawić, by funkcje curry i variadic działały w tandemie i odkryłem te same problemy, o których wspomniałeś. Potwierdza to, że słyszysz to od ciebie. – Mario

+5

Aby dać konkretny przykład dla potomności i dla osób, które niekoniecznie wiedzą, czym są "arytmy", potrzebujesz '(+ 1 2)', aby jednocześnie być '3' i funkcją kompozycyjną, ponieważ prosisz o jedno i drugie" (print (+ 1 2)) ', aby wstawić' 3' do konsoli (normalna ocena), i '((+ 1 2) 3)' by być wyrażeniem dającym '6' (currying). Sposoby, które wiemy, że oba (np. "Liczby kościelne") mają tendencję do nieudanych wyrażeń takich jak '((* 1 2) 3)' również będących '6'. –

+4

natomiast w haskell funkcja jest arytmetyczną statycznie znaną częścią jej typu (np. 'F :: Int -> (Int -> (Int -> Int))), a na każdym etapie częściowego zastosowania kontroler typu śledzi jej type (np. 'f 41 42 :: Int -> Int') – jberryman