Вопрос

Я новичок в Эрланге, поэтому простите мою наивность.

Я пытаюсь переписать функции, написанные на других языках.Одним из них является битовый индекс Жаккарда.

в 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

Это было полезно?

Решение

Могу поспорить, что вы ищете 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))
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top