gpt4 book ai didi

scala - Clojure 相当于 Scalaz Foldable 的折叠图是什么?

转载 作者:行者123 更新时间:2023-12-04 14:00:55 27 4
gpt4 key购买 nike

Scalaz trait Foldable 我们看到了 method foldMap 有以下描述

Map each element of the structure to a [[scalaz.Monoid]], and combine the results.


def foldMap[A,B](fa: F[A])(f: A => B)(implicit F: Monoid[B]): B

你可以这样使用它:
scala> List(1, 2, 3) foldMap {identity}
res1: Int = 6

scala> List(true, false, true, true) foldMap {Tags.Disjunction}
res2: scalaz.@@[Boolean,scalaz.Tags.Disjunction] = true

我的问题是: Clojure 相当于 Scalaz Foldable 的折叠图是什么?

最佳答案

默认情况下,Clojure 没有 monadic 组合。为此,您需要像 algo.monads 这样的库或 fluokitten .

Haskell 和 Skalaz 中的幺半群是一个实现三个函数的类:

  • mempty返回标识元素
  • mappend合并两个相同类型的值
  • mconcat用于将该类型的集合转换为项目和 v.v.

  • Clojure 没有调用所有这三个函数的 fold 函数; reduce是用于在集合上累加的首选高阶函数。

    默认情况下,它需要 3 个参数:reducer 函数、累加器和集合。 reducer 函数用于一次将累加器和集合中的一项组合起来。它不需要接受类似 mappend 的相同类型.第三个总是一个集合,这就是为什么 mconcat不需要。

    在 Clojure 的 1.5 clojure.reducers 的上下文中和 clojure.core/reduce ,但是有一个幺半群:一个函数在不带参数的情况下调用时返回它的标识元素。

    例如:
    (+) => 0 
    (*) => 1
    (str) => ""
    (vector) => []
    (list) => ()

    这个'monoid'函数在 reduce的两个参数版本中用作reducer。 ;它的“幺半群身份”或 mempty被调用以创建初始累加器。
    (reduce + [1 2 3]) => (reduce + (+) [1 2 3]) => (reduce + 0 [1 2 3])
    因此,如果您想翻译这里的示例,您需要找到或创建一个具有这种“monoid”实现的函数,以便在对偶数归约中使用它。

    对于析取,Clojure 有 or :
    (defmacro or
    "Evaluates exprs one at a time, from left to right. If a form
    returns a logical true value, or returns that value and doesn't
    evaluate any of the other expressions, otherwise it returns the
    value of the last expression. (or) returns nil."
    {:added "1.0"}
    ([] nil)
    ([x] x)
    ([x & next]
    `(let [or# ~x]
    (if or# or# (or ~@next)))))

    它确实有一个“monoid”实现, ([] nil) .然而, or实现为宏以支持短路,并且只能在要扩展的表达式中使用,不能作为函数参数:
    (reduce or [false true false true true])
    CompilerException java.lang.RuntimeException: Can't take value of a macro: #'clojure.core/or, compiling

    所以我们需要一个“新的” or这是一个真正的析取函数。它还应该实现一个返回 nil 的无参数版本:
    (defn newor
    ([] nil)
    ([f s] (if f f s)))

    所以现在我们有一个带有 'monoid' 实现的函数,你可以在对偶 arity reduce 中使用它:
    (reduce newor [true false true true])
    => true

    看起来有点复杂,直到你明白为什么 Clojure 实现 or作为多元宏
    (or true false true true)
    => true

    关于scala - Clojure 相当于 Scalaz Foldable 的折叠图是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21778364/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com