clojure destructuring vs haskell-like argument pattern matching

时间:2014-02-27 15:49:40

标签: haskell clojure functional-programming

来自Haskell我发现在Clojure中很难遍历某些数据类型。 在Haskell中,如果我喜欢对类型进行一些递归,在大多数基本情况下类似于

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

很好。

但我认为Clojure的解构并不像Haskell的模式匹配那么强大。是否有一个很好的惯用方法来完成我想要做的事情?举个例子,如果我有一个列表/向量,当没有更多元素时,如何匹配一个案例?

2 个答案:

答案 0 :(得分:8)

如果需要,您可以使用core.match

例如,

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

答案 1 :(得分:0)

正如A. Webb所说,你可以使用core.match来编写模式匹配样式。但是,只需原始函数就可以很容易地写出这种东西:

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