问题标签 [reader-monad]
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.
scala - Scala 中依赖注入的读者组成
这是一个简单的服务示例,其方法返回 reader:
这是一个服务消费者,它接受参数、映射,并返回阅读器本身:
好的,要使用 Service1_2.s12f1 我必须在参数列表中有地图:
问题:如何实施Service1_2.s12f2
:
为了能够像这样运行它:
主要思想是推迟将依赖传递给执行。这应该允许获得更好的组合和延迟执行。如何让它工作?阅读器的最佳实践是什么,以防存在具有此类依赖关系的嵌套调用。例如,想象一下服务,Service1_3
它在一种方法中将同时使用Service1_2.s2f2
和Service1_1.s1f1
UPDATE,好的,我可以实现它,但它看起来过于复杂:
问题是,有没有更好的方法?或者至少是语法?因为有几个级别的依赖,它看起来会很奇怪。
scala - Scala:阅读器内部带有防护功能的理解
这是代码示例:
错误是:
错误:(17, 13) 值 withFilter 不是 cat.data.ReaderT[TestQ.this.FailFast,Map[String,String],Boolean] b1 <- f1 的成员
如何用 f2 组合 f1。仅当 f1 返回 Right(true) 时才必须应用 f2。我通过以下方式解决了它:
但我希望有一个更优雅的解决方案。
scala - Scala-cats,用 ReaderT 编写 Reader
这是一个小的函数组合,所有这些函数都返回ReaderT
:
如何实现fc
以防万一f1
返回Reader
,但不是ReaderT
:
现在我必须作曲,Reader
这正是ReaderT[Id, ...]
Reader[FailFast, ...]
scala - How to inject dependencies through Scala Reader from Java code
Here is a dependency service:
Scala code that uses it via reader:
Java test where I try to inject Service1:
I am getting an exception:
Error:(10, 16) java: method run in class cats.data.Kleisli cannot be applied to given types; required: no arguments found: com.savdev.Service1 reason: actual and formal argument lists differ in length
Although in Scala I would be able to run it as:
scala - Scala:通过阅读器和兼容性进行依赖注入
当我们通过 Reader 实现 DI 时,我们将依赖项作为方法签名的一部分。假设我们有(没有实现):
现在,f2
需要额外的服务来实现,比如:
它将破坏现有客户,如果Service2.f2
不提供Service3
额外服务,他们将无法再使用。
通过注入(通过构造函数或设置器)进行 DI,这在 OOP 中很常见,我将c
仅用作Service2
. 它是如何构造的以及它的依赖项列表是什么,我不在乎。从这一点开始,任何新的依赖都Service2
将保持函数的签名c
不变。
它是如何以FP方式解决的?有选择吗?有没有办法注入新的依赖项,但以某种方式保护客户免受更改?
scala - Scala:用 ReaderT 和 Option 编写理解
这是示例:
它工作正常。我只想重写s2f1
没有ReaderT.apply
方法:
这是一个工作示例Reader[...,Int]
,但不是ReaderT[Option,...]
:
我想获得类似的语法。
scala - Scala:具有不同上下文和依赖关系的 ReaderT 组合
返回不同 ReaderT的s3f1
和s3f2
函数的示例:
我尝试组合这两个函数,它们返回具有不同F[_]
上下文和依赖关系的读者:ReaderT[Option, Service1, Int]
和ReaderT[FailFast, Service2, Int]
我必须以某种方式F[_]
结合上下文,这意味着FailFast
结合Option
. 我认为,将它结合起来是有意义的FailFast[Option]
:
如何组合 s3f1 和 s3f2:
scala - Scala-cats:阅读器组合
错误:
错误:(26, 11) 类型不匹配;找到:T1.this.Env => com.savdev.Cats(扩展为)((com.savdev.Service1,com.savdev.Service2,com.savdev.Cats))=> com.savdev.Cats required:com .savdev.Cats } 产生猫
你能解释一下,为什么猫不是com.savdev.Cats
?以及为什么在错误中,它说它被扩展为具有返回方法的函数[Cats]
,而不是机器人FailFast[Cats]
我尝试应用与此处完全相同的逻辑:
在此示例中,我可以将函数 Service1.s1f 转换为其结果 r2 并且它工作正常。为什么我不能,例如写这样的东西:
haskell - Reader monad 能做哪些应用函数不能做的事情?
阅读http://learnyouahaskell.com/functors-applicative-functors-and-monoids#applicative-functors后,我可以提供一个将函数用作应用函子的示例:
假设res
是一个有 4 个参数的函数,fa
, fb
, fc
,fd
都是接受单个参数的函数。然后,如果我没记错的话,这个适用的表达式:
意思与这个非花哨的表达相同:
啊。我花了相当多的时间来理解为什么会这样,但是——在一张纸和我的笔记的帮助下——我应该能够证明这一点。
然后我阅读了http://learnyouahaskell.com/for-a-few-monads-more#reader。我们又回到了这个问题上,这次是单子语法:
虽然我需要另一张 A4 纸来证明这一点,但我现在非常有信心,这再次意味着相同:
我很困惑。为什么?这有什么用?
或者,更准确地说:在我看来,这似乎只是将函数的功能复制为应用程序,但语法更冗长。
那么,你能给我举个例子,说明 Reader monad 能做到 applicatives 不能做到的吗?
实际上,我还想问这两个中的任何一个有什么用:应用函数或 Reader monad - 因为虽然能够将相同的参数应用于四个函数(fa
, fb
, fc
, fd
)而不用重复这个参数四次确实减少了一些重复性,我不确定这一微小的改进是否能证明这种复杂程度;所以我想我一定错过了一些突出的东西;但这值得一个单独的问题
performance - StateT over Reader 和 ReaderT over State 之间有什么显着区别吗?
当我设计我的编程模型时,我总是陷入困境,哪种方法更好:
使用一个monad而不是另一个monad有什么好处和权衡?这有关系吗?性能怎么样?