سؤال

أنا جديد في Erlang، لذا يرجى أن تغفر لي سذاجتي.

أحاول إعادة كتابة الوظائف التي كتبتها بلغات أخرى.واحد منهم هو مؤشر بت jaccard.

في بيثون هاسكل و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