来自Haskell我发现在Clojure中很难遍历某些数据类型。 在Haskell中,如果我喜欢对类型进行一些递归,在大多数基本情况下类似于
foo (x : []) = Just value
foo (x : y : xs) = bar y (foo xs)
foo _ = Nothing
很好。
但我认为Clojure的解构并不像Haskell的模式匹配那么强大。是否有一个很好的惯用方法来完成我想要做的事情?举个例子,如果我有一个列表/向量,当没有更多元素时,如何匹配一个案例?
答案 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))