Что такое Clojure-эквивалент inject:into: в Smalltalk?

Я пытаюсь выучить Clojure, но мои синапсы, похоже, жестко привязаны к Smalltalk.

Что эквивалентно этой функции?

[:n :k | (1 to: k) inject: 1 into: [:c :i | c * (n - k + i / i)]]
  • это биномиальный коэффициент для n, k, также известный как функция «выбрать», представляющий количество комбинаций n вещей, взятых k раз.

person Steve Wart    schedule 28.01.2011    source источник
comment
Потрясающий. Вот что у меня получилось (defn Choose [n k] (reduce (fn [c i] (* c (/ (+ (- n k) i) i))) 1 (диапазон 1 (+ k 1)))). Это было довольно легко, как только я понял, как преобразовать инфиксную нотацию Smalltalk в Lisp, но синтаксис все еще причиняет мне боль :)   -  person Steve Wart    schedule 28.01.2011
comment
Вместо (+ k 1) вы также можете использовать (inc k).   -  person Michael Kohl    schedule 28.01.2011


Ответы (1)


Эквивалентом lst inject: s into: f в clojure является (reduce f s lst)

person sepp2k    schedule 28.01.2011
comment
Слишком быстро, слишком быстро. Я опоздал примерно на 20 секунд! - person Frank Shearar; 28.01.2011
comment
Я бы скорее сказал, что #inject:into: эквивалентен reduce, так как smalltalk вдохновлен lisp :) - person mathk; 29.01.2011