Эрланг карта
Я новичок в Erlang, поэтому, пожалуйста, прости мою наивность.
Я пытаюсь переписать функции, которые я написал на других языках. Одним из них является битовый индекс jaccard.
в python haskell и clojure это будет работать следующим образом:
xs = [1,1,0,0,1,1,0,0,1,1,0,0]
ys = [1,0,1,0,1,0,1,0,1,0,1,0]
# python 3.X
def jaccard_bit_index(A,B):
i = sum(map(operator.mul ,A,B))
return i / (sum(A) + sum(B) - i)
-- haskell
jaccrd_bit_index a b =
count / ((sum a) + (sum b) - count)
where
count = sum $ zipWith (*) a b
%% clojure
(defn jaccard-bit-index [a b]
(let [binarycount (apply + (map * a b))]
(/ binarycount
(- (+ (apply + a) (apply + b))
binarycount))))
Я думаю, что моя проблема в том, что я знаю только об Эрланге
map(Fun, List1) -> List2
и каждый раз, когда я делал это раньше, я использовал что-то похожее на:
map(Fun, List1, List2) -> List3
1 ответ
Решение
Могу поспорить, что вы ищете это zipwith
функция от list
модуль (http://www.erlang.org/doc/man/lists.html). Это похоже на zipWith
Функция haskell, которую вы использовали, имеет тип:
zipwith(Combine, List1, List2) -> List3
Вы, вероятно, будете использовать что-то вроде:
Count = lists:sum(lists:zipwith(fun(X, Y) -> X*Y end, A, B))