سؤال
أنا جديد في 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))
لا تنتمي إلى StackOverflow