问题标签 [kleisli]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
751 浏览

list - 理解一元函数组合

我正在从“Learn You a Haskell for Great Good!”一书中学习 monads。米兰利波卡。我试图了解单子的结合律。从本质上讲,法律规定,当您拥有一串带有 的单子函数应用程序时>>=,它们的嵌套方式无关紧要。

以下代码使人们能够将类型函数的结果传递给类型a -> m b函数b -> m c

但是,对于下面的示例:

f xg x两者的功能?似乎它们是具有不同 x 值而不是函数的列表。let h = f <=< g该行在上面的代码中是如何工作的?f并且g必须是函数,因为它们与它们一起使用,<=<但我不确定它们是什么。

0 投票
1 回答
189 浏览

haskell - f, g, h :: Kleisli ((->) e) ab <=> f >>> (g &&& h) = (f >>> g) &&& (f >>> h)?

p编辑:如果存在这样的函数,我们将调用纯箭头fp = arr f.

我正在尝试更好地掌握 Haskell 中的 Arrows,我想知道什么时候

f >>> (g &&& h) = (f >>> g) &&& (f >>> h), f, g,h是箭头。

显然,这通常不是真的。在此特定示例中,副作用在右侧重复:

显然,f >>> (g &&& h) = (f >>> g) &&& (f >>> h)如果f是纯粹的。

我在 GHCi 中用这个语句进行试验f, g, h :: Kleisli ((->) e) a b,并没有设法找到f,ghthat的值f >>> (g &&& h) ≠ (f >>> g) &&& (f >>> h)。这个陈述对于 真的是真的吗f, g, h :: Kleisli ((->) e) a b,如果是的话,这是否是一个有效的证明: 的效果Monad ((->) e)是从环境中读取。因此,应用的结果f是函数将借助该函数从环境中读取gh无论这个函数是在哪里创建的——都是一样的,因为它每次都应用于同一个参数,因此从环境中读取的结果是相同的,因此整体结果也是一样的。

0 投票
2 回答
67 浏览

scala - 如何使用 Kleisli.local 创建 Kleisli(不是本地转换)

有2local种方法定义为:

并作为:

第二个应该用作工厂方法来构建 Kleisli。

您能否提供任何用例来使用中定义的第二种方法KleisliFunctions来创建 Kleisli 的实例。如果可能的话,举个例子。无法得到它,这种方法可能有用。

0 投票
2 回答
386 浏览

haskell - 为什么 kleisli 组合需要一个纯值?

这是 kleisli 组合的常见实现:

为什么它不期望一元上下文中的值呢?我确信这是有充分理由的。我只是没有设法看到它。

该类型似乎更易于组合,并且return可以在调用站点上只有纯值的情况下使用。

0 投票
1 回答
164 浏览

haskell - 箭头定律:首先仅取决于对的第一个分量。为什么我们需要这个?

John Hughes 在他的“Generalising Monads to Arrows”中写道(第 8 章):

first f我们将仅依赖于对的第一个组件 的属性形式化如下:first f >>> arr fst = arr fst >>> f

我知道法律会过滤掉这种类型的实现:

但是对于这种情况,措辞似乎有点奇怪(对于这种情况,我会选择“first没有副作用”或类似的东西)。

那么,保留它的其他原因是什么?

此外,还有一条规律:first f >>> second (arr g) = second (arr g) >>> first f。我没有找到它过滤掉的任何实现(我确实 - 请参阅编辑)。这部法律对我们有什么帮助?


编辑:关于后一种法律的更多想法。

看看下面的代码片段:

这样的实例的行为方式如下:

据我所知,我们没有法律second f = swap >>> first f >>> swap。因此,我们可以禁止这两种方法second,也可以禁止first这条法律产生任何副作用。然而,原来的措辞似乎仍然没有再次暗示这一点:

...我们将直觉中的第二个组成部分不受first f法律的影响...

那些法律只是纯粹的形式化的可靠证明吗?

0 投票
1 回答
119 浏览

scala - Scala Kleisli 在 IntelliJ 中引发错误

尝试在 Scala 中为虚构的 Partial 类型实现 Kleisli 类别(阅读 Bartosz Milewski 的“程序员的类别理论”,这是第 4 章的练习题)

IDE (IntelliJ) 没有显示错误,但是当我运行此代码段时,我得到:

>=>在隐式类之外定义工作正常。可能是什么原因?

0 投票
0 回答
69 浏览

scala - 澄清scala中的一些函数式编程术语

虽然此时我对 function1 Monad 及其转换器版本(即 Kleisli 组合)非常满意,但回到我最初开始阅读的一本书,我仍然无法真正理解所使用的行话,有点强调典型之间的区别一元行为和 kleisli 组合。我发现这种区别不直观且具有误导性。

我怀疑作者想强调 Function1 Monad 与其他 monad 相比的延迟评估的概念,但这只是使用函数的效果。

无论如何,我想知道是否有人可以澄清一些作者声明:

函数应用对我们称为效果的附加结构的力量——你已经看到了普通函数是如何组成的,以及它们是如何应用于一个参数的。但这对于领域模型可能还不够,您需要在应用点应用具有自定义行为的函数。看一下 flatMap 提供的函数应用:def flatMap[A, B](ma: F[A])(f: A => F[B]): F[B]。它将 A => F[B] 应用于 F[A],然后将 F[F[B]] 展平为 F[B]。在这里,您在应用点进行展平,以便您恢复提供给 flatMap 的结构。这使您能够在 F[_] 的有效结构上对函数应用程序进行排序。

…………

函数组合对我们称为效果的附加结构的能力——如果你有一个函数 f: A => F[B] 和另一个函数 g: B => F[C],其中 F 是一个单子,那么你可以组合他们得到A => F [C]。这不是普通的函数组合;它是一元函数的组成。它也被称为 Kleisli 组合;

…………

我不明白的行话是“功能应用的力量”“功能组合的力量”, 尤其是当作者试图用以下内容表达观点时:

它将 A => F[B] 应用于 F[A],然后将 F[F[B]] 展平为 F[B]。在这里,您在应用点进行展平,以便您恢复提供给 flatMap 的结构。

无论您是从一元函数开始还是仅从效果开始,都会发生同样的事情。对我来说,效果甚至可以看作函数Unit => F[A]。

因此,如果我不理解作者试图强调的内容,或者是作者没有正确地表达观点并且我已经明白了所有要点,我就不清楚了。

无论如何,应用的意义何在?怎么不在function1中?

0 投票
2 回答
111 浏览

scala - 具有无标签最终样式的 Kleisli 依赖项

我正在尝试使用 Kleisli 对依赖项进行建模。例如,假设我有以下业务逻辑类型:

现在我有以下解码和数据库访问的实现:

现在,当我想将这两个对象与业务逻辑一起使用时,我遇到了类型冲突:Kleisli[ErrorOr, DbSession, A] 与 Klesili[ErrorOr, Any, A] 不兼容。

像这样组成类的最“正确”的方式是什么?我不想让我的解码器需要数据库会话,而且我也不想在解码器周围创建一个副本/包装器。