2016-12-25 13 views
5

私が見ることができる唯一の利点は、partialへの呼び出しを避けることです。なぜclojureスレッドは最後に( - >>)マクロですか?

(defn foldl [f acc xs] 
    (loop [acc acc 
     xs xs] 
    (if (empty? xs) 
     acc 
     (recur (f (first xs) acc) (rest xs))))) 

(defn $ [f x] (f x)) 

(defn thread-last [x & rest] 
    (foldl $ x rest)) 

います:機能的/明示的なバージョンが失敗したときに

(thread-last (range 10) 
      (partial map inc) 
      (partial filter odd?) 
      (partial reduce +)) => 25 

(->> (range 10) 
    (map inc) 
    (filter odd?) 
    (reduce +)) => 25 

は、どのケースがありますか?

+0

各フォームの先頭に「部分的」を貼り付けることができない場合や、このような場合に*有用な*を求めている場合がありますか? –

+0

最初の部分は、部分的(または引数の配置のためにラムダ)を使用できないケースです。 – beoliver

答えて

12

まず、foldlがちょうどreduceであることに注意してください。私たちの言語はではなく、ハスケルよりも貧しいです!

第2に、すべてのフォームが関数呼び出しであるとは限らず、->>はすべてのフォームを書き換えることができます。たとえば、あなたは少しHaskellのwhere句のようなものを実装するために->>を使用することができます。

(defn mapcat' [f xs] 
    (->> (apply concat mapped) 
     (let [mapped (map f xs)]))) 

そうでもないのClojureプログラマに人気があり、それは何か->>の一例として、スタイルがpartial「のことを行うことができますt。

+0

否定的な意味合いは意図されていませんでした。私は最近、制作にclojureを使用しています。私はfoldl-whileや他のコンストラクトで遊んでいたときにfoldlを書いた。 – beoliver

関連する問題