2015-07-12 12 views
19

Haskell stride le sue funzioni. Clojure non permette però di usare le macro partial e le funzioni come approccio comparabile per fare lo stesso.Motivo di Rich Hickey per le funzioni Clojure non auto-curricum?

Pensavo di aver ricordato di aver sentito/letto il motivo alla base della decisione di Hickey. Qualcuno ricorda quale fosse questa ragione o dove potevo trovarla?

Speravo di imparare qualcosa dalla logica.

+1

Suppongo che almeno una parte del motivo sia Clojure non al 100% pigro e l'applicazione non può essere posticipata –

+3

La prima frase non è precisa. Haskell saluta * tutte * le funzioni, indipendentemente dal numero di argomenti forniti. In verità, tutte le funzioni di Haskell accettano un input e restituiscono un output. https://wiki.haskell.org/Currying https://wiki.haskell.org/Composing_functions_with_multiple_values. In Haskell la funzione ** uncurry ** in realtà non è incerta; invece, prende le prime due funzioni della catena e le compone in un'unica funzione che prende una ** coppia ** come singolo input. – itsbruce

+3

omaggiando Haskell Curry. – rem

risposta

26

Poiché le funzioni possono avere più origini, è possibile avere una chiamata di funzione diretta anziché una funzione di elaborazione. Successivamente, se nel caso si dispone di un solo arity e si perde un argomento, l'errore aritmetico non viene rilevato e genera invece una funzione currying. Un caso molto brutto e difficile da eseguire il debug, soprattutto se la funzione restituisce una funzione con la stessa arity richiesta o se la funzione viene passata come argomento a un'altra funzione.

Quindi, in particolare, la creazione di una funzione di curring sembra legittima.

+3

Stavo lavorando su un codice un po 'ispirato a Clojure e cercando di far funzionare le funzioni curry e variad in tandem e avevo scoperto gli stessi problemi che hai menzionato. Sta riaffermando di sentirlo da te. – Mario

+5

Per dare un esempio concreto per i posteri e per le persone che non conoscono necessariamente le "entità", è necessario '(+ 1 2)' per essere contemporaneamente '3' e una funzione componibile perché si sta chiedendo sia' (print (+ 1 2)) 'per mettere' 3' sulla console (valutazione normale), e '((+ 1 2) 3)' per essere un'espressione che restituisce '6' (currying). I modi sappiamo che entrambi (ad es. "Numeri di Chiesa") tendono a fallire su espressioni come '((1 1 2) 3)' anche essendo '6'. –

+4

mentre in haskell l'arità di una funzione è una parte del suo tipo statisticamente conosciuta (es. 'F :: Int -> (Int -> (Int -> Int))'), e in ogni fase dell'applicazione parziale il controllore del tipo ne tiene traccia tipo (es. 'f 41 42 :: Int -> Int') – jberryman

Problemi correlati