【问题标题】:clojure destructuring vs haskell-like argument pattern matchingclojure 解构与类似 haskell 的参数模式匹配
【发布时间】:2014-02-27 15:49:40
【问题描述】:

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

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

很好。

但我认为 Clojure 的解构功能远不及 Haskell 的模式匹配强大。有没有一种很好的惯用方式来完成我想要做的事情?例如,如果我有一个列表/向量,当没有更多元素时如何匹配一个案例?

【问题讨论】:

  • @octopusgrabbus 那是什么样的修正?

标签: haskell clojure functional-programming


【解决方案1】:

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

例如,

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

【讨论】:

  • 它被广泛使用还是我正在寻找一种在 Clojure 中不需要的模式?
  • @ayanahmedov 它经常被使用但并不广泛——或者如果你更喜欢它不是惯用语。模式匹配和解构的最大区别在于模式匹配是关于严格的结构和分派,而解构是关于松散的结构。它们的用途不同。
  • 对于一个去年刚从 beta 毕业的图书馆来说,使用频率是衡量有用性的一个很差的衡量标准。
【解决方案2】:

正如 A. Webb 所说,您可以使用 core.match 来编写模式匹配样式。然而,这种东西可以很容易地用原始函数来编写:

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

【讨论】:

  • 您的代码假定 nil 和 false 不是序列的合法值。
  • @cgrand:确实如此。适应这种情况并不难,但我认为我们讨论的是一般形式而不是具体情况。
猜你喜欢
  • 2021-02-12
  • 1970-01-01
  • 1970-01-01
  • 2011-04-02
  • 1970-01-01
  • 2015-10-19
  • 1970-01-01
  • 1970-01-01
  • 2014-07-01
相关资源
最近更新 更多