加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scalaz:请求Cokleisli组合的用例

发布时间:2020-12-16 09:35:51 所属栏目:安全 来源:网络整理
导读:这个问题不是火焰诱饵!可能很明显,我最近一直在看 Scalaz。我想了解为什么我需要一些库提供的功能。这里有些东西 import scalaz._import Scalaz._type NEL[A] = NonEmptyList[A]val NEL = NonEmptyList 我在我的函数中放了一些println语句,看看发生了什么
这个问题不是火焰诱饵!可能很明显,我最近一直在看 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) }

然后我通过cokleisli结合他们,并通过NEL [Int]

val k = cokleisli(f) =>= cokleisli(g)
println("RES: "  + k( NEL(1,2,3) ))

这是什么打印?

f: NonEmptyList(1,3)
f: NonEmptyList(2,3)
f: NonEmptyList(3)
g: NonEmptyList(NonEmptyList(1,3)X,NonEmptyList(2,NonEmptyList(3)X)
RES: 57

RES值是最终NEL中(String)元素的字符数。我有两件事情

>我怎么知道我的NEL将以这种方式从所涉及的方法签名中减少? (我根本没想到结果)
>这是什么意思?可以为我简单易用的用例吗?

这个问题对于像retronym这样的可爱的人来说,这个强大的图书馆实际上是如何工作的,是一个薄薄的恳求。

解决方法

要了解结果,您需要了解Comonad [NonEmptyList]实例。 Comonad [W]本质上提供了三个功能(Scalaz中的实际界面有所不同,但这有助于解释):

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

因此,Comonad为一些容器W提供了一个界面,该容器W具有一个独特的“头”元素(copure),并且暴露了容器的内部结构的一种方法,以便我们为每个元素(cojoin)获取一个容器,每个元素都具有给定的元素头部。

为NonEmptyList实现的方式是,copure返回列表的头部,cojoin返回列表列表,该列表位于该列表的头部和尾部的所有尾部。

示例(我正在缩短NonEmptyList到Nel):

Nel(1,3).copure = 1
Nel(1,3).cojoin = Nel(Nel(1,3),Nel(2,Nel(3))

=> =函数是coKleisli组合。你如何组成两个函数f:W [A] => B和g:W [B] => C,除了W是Comonad以外,他们什么都不知道f的输入类型和g的输出类型不兼容。但是,您可以映射(f)以获取W [W [A]] => W [B]然后用g组成。现在,给定一个W [A],你可以加入它以使W [A]进入该函数。所以,唯一合理的组合是一个函数k,它执行以下操作:

k(x) = g(x.cojoin.map(f))

所以对于你的非空列表:

g(Nel(1,3).cojoin.map(f))
= g(Nel(Nel(1,Nel(3)).map(f))
= g(Nel("Nel(1,3)X","Nel(2,"Nel(3)X"))
= BigInt(Nel("Nel(1,"Nel(3)X").map(_.length).sum)
= BigInt(Nel(11,9,7).sum)
= 27

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读