2012-07-28 202 views
1

我是Erlang的新手,所以請原諒我的天真。erlang map函數

我正在嘗試重寫我用其他語言編寫的函數。其中之一是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)))) 

我想我的問題是,我只知道Erlang的

map(Fun, List1) -> List2

每一次之前,我已經做到了我用過一些類似於:

map(Fun, List1, List2) -> List3

回答

4

我敢打賭,您正在搜索的是list模塊的zipwith函數(http://www.erlang.org/doc/man/lists.html)。 它類似於您使用zipWith哈斯克爾功能,且類型:

zipwith(Combine, List1, List2) -> List3 

你可能會使用這樣的:

Count = lists:sum(lists:zipwith(fun(X, Y) -> X*Y end, A, B)) 
+0

看起來像正是我期待的! – beoliver 2012-07-28 16:40:13