clojure解构与haskell-like参数模式匹配

clojure解构与haskell-like参数模式匹配,haskell,clojure,functional-programming,Haskell,Clojure,Functional Programming,来自Haskell,我发现在Clojure中很难遍历某些数据类型。 在Haskell中,如果我喜欢对类型进行递归,在最基本的情况下 foo (x : []) = Just value foo (x : y : xs) = bar y (foo xs) foo _ = Nothing 很好 但我认为Clojure的解构远没有Haskell的模式匹配那么强大。有没有一种很好的惯用方法来完成我想做的事情?例如,如果我有一个列表/向量,当没有更多的元素时,我如何匹配一个大

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

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

但我认为Clojure的解构远没有Haskell的模式匹配那么强大。有没有一种很好的惯用方法来完成我想做的事情?例如,如果我有一个列表/向量,当没有更多的元素时,我如何匹配一个大小写?如果需要,您可以使用

比如说,

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

正如A.Webb所说,您可以使用core.match以模式匹配的方式编写。但是,仅使用基本函数就可以非常轻松地编写此类内容:

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

@octopusgrabbus这是一种什么样的纠正?它是被广泛使用的还是我在寻找一种在Clojure中不必要的模式?@ayanahmedov它经常被使用,但并不被广泛使用——或者如果你更喜欢它不是一种习惯主义。模式匹配和解构的最大区别在于,模式匹配是关于严格的结构和调度,而解构是关于松散的结构。它们的用途不同。对于去年刚从beta版毕业的库来说,使用频率是一个很差的有用性度量。您的代码假设nil和false不是序列的合法值。@cgrand:这是真的。适应这种情况并不难,但我认为我们讨论的是一般形式,而不是具体情况。