2011-08-11 27 views
2

在Clojure中有更好的方法嗎?接受單數或集合的地圖

(if (coll? coll) 
    (map my-fn coll) 
    (my-fn coll) 

將應用於輸入collcoll可以是單數也可以是集合。

如果我不檢查coll?,單獨使用map會拋出IllegalArgumentException,因爲不知道如何從xxx創建ISeq。

回答

4

你的代碼是好的(雖然我會重命名變量coll,因爲你實際上不知道它是否是一個集合,這可能會使讀者感到困惑)。

但是,我建議這整段代碼看起來像一個代碼氣味 - 它採取動態打字有點太遠/試圖有點太聰明在我看來:在「cleverness considered harmful」的意義上。

另類的想法來考慮:

  • 如果你真的想要把一切都像一個集合,然後再包奇輸入值時,在長度爲1的列表/矢量然後將剩下首先獲得他們的代碼可以安全地假設整個集合。
  • 編寫單獨的函數來處理集合和單個值。理由是它們在概念上是不同的數據類型,所以應該得到不同的處理。
1

如果coll不包含任何嵌套的序列:

(map my-fn (flatten (list coll))) 
1

沒有通用的解決方案可以存在,因爲可以是一個函數,它列出並返回列表。那麼你不能以某種方式檢查輸入並決定是否映射它。

更好的辦法是不要讓自己陷入不知道自己的數據類型的情況,但如果不知道更多關於程序的信息,我無法給出任何具體建議。

+0

它實際上incanter.stats中的樣板 –