gpt4 book ai didi

Scalaz:请求 Cokleisli 组合的用例

转载 作者:行者123 更新时间:2023-12-03 13:56:52 24 4
gpt4 key购买 nike

这个问题不是诱饵!很明显,我一直在查看 Scalaz最近。我试图理解为什么我需要图书馆提供的一些功能。这里有一些东西:

import scalaz._
import Scalaz._
type NEL[A] = NonEmptyList[A]
val NEL = NonEmptyList

我在我的函数中放了一些 println 语句来查看发生了什么(另外:如果我试图避免这样的副作用,我会怎么做?)。我的职能是:
val f: NEL[Int] => String    = (l: NEL[Int]) => {println("f: " + l); l.toString |+| "X" }
val g: NEL[String] => BigInt = (l: NEL[String]) => {println("g: " + l); BigInt(l.map(_.length).sum) }

然后我通过 组合它们科克莱斯利并传入 NEL[Int]
val k = cokleisli(f) =>= cokleisli(g)
println("RES: " + k( NEL(1, 2, 3) ))

这个打印什么?
f: NonEmptyList(1, 2, 3)
f: NonEmptyList(2, 3)
f: NonEmptyList(3)
g: NonEmptyList(NonEmptyList(1, 2, 3)X, NonEmptyList(2, 3)X, NonEmptyList(3)X)
RES: 57

RES 值是最终 NEL 中 (String) 元素的字符数。我想到两件事:
  • 我怎么能从所涉及的方法签名中知道我的 NEL 将以这种方式减少? (我根本没想到结果)
  • 这有什么意义?可以为我提炼出一个相当简单且易于理解的用例吗?

  • 对于像 retronym 这样可爱的人来说,这个问题是一个隐晦的请求。解释这个强大的库是如何工作的。

    最佳答案

    要了解结果,您需要了解 Comonad[NonEmptyList]实例。 Comonad[W]本质上提供了三个函数(Scalaz 中的实际接口(interface)有点不同,但这有助于解释):

    map:    (A => B) => W[A] => W[B]
    copure: W[A] => A
    cojoin: W[A] => W[W[A]]

    所以, Comonad为某些容器提供接口(interface) W它有一个独特的“头”元素( copure)和一种暴露容器内部结构的方法,这样我们每个元素都有一个容器( cojoin),每个容器的头部都有一个给定的元素。
    NonEmptyList 的实现方式是 copure返回列表的头部, cojoin返回一个列表列表,此列表位于头部,此列表的所有尾部位于尾部。

    示例(我将 NonEmptyList 缩短为 Nel ):
    Nel(1,2,3).copure = 1
    Nel(1,2,3).cojoin = Nel(Nel(1,2,3),Nel(2,3),Nel(3))
    =>=功能是coKleisli组合。你将如何组合两个函数 f: W[A] => Bg: W[B] => C ,除此之外对他们一无所知 WComonad ? f的输入类型和 g 的输出类型不兼容。但是,您可以 map(f)获取 W[W[A]] => W[B]然后用 g 组成.现在,给定一个 W[A] , 你可以 cojoin它得到 W[W[A]]输入该功能。因此,唯一合理的组合是函数 k执行以下操作:
    k(x) = g(x.cojoin.map(f))

    所以对于你的非空列表:
    g(Nel(1,2,3).cojoin.map(f))
    = g(Nel(Nel(1,2,3),Nel(2,3),Nel(3)).map(f))
    = g(Nel("Nel(1,2,3)X","Nel(2,3)X","Nel(3)X"))
    = BigInt(Nel("Nel(1,2,3)X","Nel(2,3)X","Nel(3)X").map(_.length).sum)
    = BigInt(Nel(11,9,7).sum)
    = 27

    关于Scalaz:请求 Cokleisli 组合的用例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2560219/

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