On 14 Jun 2010, at 12:37, Steve Purcell wrote:

> On 14 Jun 2010, at 01:14, Todd wrote:
> 
>> I'm attempting to write a simple histogram function:
>> 
>> <code>
>> (defn create-histogram [f]
>> (let
>>   [words (read-lines f)
>>    histo {}]
>>   (doall
>>     (map
>>       (fn [w] (assoc histo w (+1 (get histo w 0))))
>>       words))
>>   histo))
>> 
>> (create-histogram "./testwords")
>> </code>
>> 
>> The input, 'f', is expected to be a file of words, as you'd get from 
>> '/usr/share/dict/words'.
>> 
>> I don't see how to accumulate the results in the map, 'histo'. This is 
>> really a question of how does one map a function to a collection and 
>> accumulate the results...
> 
> 
> "reduce" is the canonical way to combine a number of input values into a 
> single result. Here you're constructing a histogram from a sequence of words, 
> so try something like the following:
> 
> (defn create-histogram [f]
> (reduce (fn [hist word]
>           (merge-with + hist {word 1}))
>         {}
>         (read-lines f)))


Or even:

(defn create-histogram [f]
  (apply merge-with + (map array-map (read-lines f) (repeat 1))))


In any case, your original code could be re-written to use 'reduce' like this:

(defn create-histogram [f]
  (let [words (read-lines f)]
    (reduce (fn [histo w] (assoc histo w (inc (get histo w 0))))
            {}
            words)))


-Steve

-- 
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en

Reply via email to