2014-02-27 29 views
3

來自Haskell我發現在Clojure中很難遍歷一些數據類型。 在Haskell,如果我喜歡做一個類型的一些遞歸,在最基本的情況下,像clojure解構vs haskell-like參數模式匹配

foo (x : [])  = Just value 
foo (x : y : xs) = bar y (foo xs) 
foo _   = Nothing 

就好了。

但我認爲Clojure的解構並不像Haskell的模式匹配那樣強大。有沒有一種很好的習慣方法來完成我想要做的事情?舉例來說,如果我有一個列表/向量,當沒有更多的元素時,如何匹配一個案例?

+0

@octopusgrabbus什麼樣的修正是? –

回答

8

如果需要

例如可以使用core.match

(defn foo [v] 
    (match v 
    [x] x 
    [x y & more] (+ (* x y) (foo more)) 
    :else nil)) 
+0

它被廣泛使用,或者我正在尋找一種在Clojure中不需要的模式? –

+0

@ayanahmedov它經常被使用但並不廣泛 - 或者如果你喜歡它不是一種習慣用法。模式匹配與解構的區別在於模式匹配是嚴格的結構和調度,而解構則是鬆散的結構。他們沒有達到相同的目的。 – cgrand

+1

使用頻率對於去年剛剛從beta版畢業的圖書館來說是一個不好的衡量指標。 –

0

正如A.韋伯說,你可以使用core.match的模式匹配風格來寫。然而,這種事情可以用原始函數很容易地寫出來:

(defn foo [[x y & xs]] 
    (cond 
    (and x y) (bar y (foo xs)) 
    x   x 
    :else  nil)) 
+0

你的代碼假設nil和false不是序列的合法值。 – cgrand

+0

@cgrand:的確如此。在這種情況下適應並不困難,但我認爲我們正在談論一般形式而不是具體案例。 – Chuck