我想用Clojure hashmaps來定義廣義載體。在這幅圖中,散列圖{:x 3:y 2:z( - 3)}表示符號表達式3x + 2y - 3z。Clojure hashmaps作爲廣義載體
我想的函數代+充當上包含HashMap加法運算,以及滿足以下約束條件:
- 應用根+兩個包含HashMap具有重疊鍵返回與求和那些鍵值散列映射。例如,
(gen+ {:x 1} {:x 2})
;= {:x 3}
- 應用根+兩個包含HashMap與不同的鍵返回與這些鍵值組合的散列映射。例如,
(gen+ {:x 1} {:y 2})
;= {:x 1 :y 2}
- 的空HashMap {}是根+功能的添加劑的身份。例如,
(gen+ {:x 1} {})
:= {:x 1}
- 通過上述的限制,與非零項的任何散列映射也是一種添加劑身份。例如,{:z 0}。由於這種冗餘,gen +函數應該總是返回沒有任何0值的hashmaps。例如,
(gen+ {:x 1 :y 0} {:z 0})
;= {:x 1}
- Clojure的解釋丟失的鑰匙爲具有值零,而不是0,與
({:x 3} :y) ;= nil
。因此,根+應該把零值的方法相同爲0。例如,
(gen+ {:x 1 :y 0} {:x nil :y nil})
{:x 1}
- 我的問題:我們如何可以編寫一個函數代+滿足上述約束條件?一旦到位,是否可以使用gen +函數超載+運算符,從而使基本加法與hashmaps?
爲什麼這種形式主義對待包含HashMap作爲廣義載體應該是顯而易見的。 Clojure解釋了一個類似於[x0 x1 x2]的向量,它與hashmap {:0 x0:1 x1:2 x2}幾乎相同,稍有不同,我不太明白。因此,如果我們將gen +應用於兩個向量,那麼它應該與應用於它們的效果相同。這使我們能夠輕鬆地使用稀疏向量,以及添加不同大小的向量。例如,
(gen+ [0 0 0 4] [0 0 0 0 0 0 0 0 0 9])
;= {:4 4 :9 9}
這就是我不理解包含HashMap和載體。如果我將hashmap作爲函數調用,那麼我需要應用一個關鍵參數,如:2。在另一方面,如果我叫一個向量作爲功能,我需要申請一個索引參數一樣2.如
({:2 2} :2)
;= 2
([0 1 2] 2]
;= 2
即使你不能幫助gen +函數,你能解釋爲什麼hashmaps和vector在被稱爲函數時表現不同嗎?
就像中號史密斯,我不會建議超載+,[但這裏的一些黑暗魔法(HTTP://無論如何,stackoverflow.com/questions/5433691/idiomatic-clojure-way-to-repeat-a-string-n-times/5438379#5438379)。 –
如果這是一個學校項目,道具給你的學校接受clojure。 – muhuk
@muhuk:我是一名專業數學家,主要從事功能分析(無限維線性代數)。當感興趣的空間/類型是線性空間時,這些工具適用,點/術語是矢量,地圖/函數是線性運算符。能夠使用hashmaps作爲向量,意味着我們可以部署現代數學技術,而不必重新發明輪子。這個觀點在MapReduce體系結構中特別有用,其中感興趣的基本對象是鍵/值對,就像hashmaps一樣。 –