Man*_*idt 24 monads functional-programming dependency-injection scala
我最近看到了谈判死亡简单的依赖注入和依赖注入没有体操关于DI与Monads并且留下了深刻的印象.我试图将它应用于一个简单的问题,但是一旦它变得非常重要就失败了.我真的很想看到依赖注入的运行版本
如下例所示
trait FlyBehaviour { def fly() }
trait QuackBehaviour { def quack() }
trait Animal { def makeSound() }
// needs two behaviours injected
class Duck(val flyBehaviour: FlyBehaviour, val quackBehaviour: QuackBehaviour) extends Animal
{
def quack() = quackBehaviour.quack()
def fly() = flyBehaviour.fly()
def makeSound() = quack()
}
// needs an Animal injected (e.g. a Duck)
class Zoo(val animal: Animal)
// Spring for example would be able to provide a Zoo instance
// assuming a Zoo in configured to get a Duck injected and
// a Duck is configured to get impl. of FlyBehaviour and QuackBehaviour injected
val zoo: Zoo = InjectionFramework.get("Zoo")
zoo.animal.makeSound()
Run Code Online (Sandbox Code Playgroud)
看到使用阅读器Monad的示例实现真的很有帮助,因为我只是觉得我错过了正确方向的推动.
谢谢!
Apo*_*isp 27
"读者monad"就是Function1这样,所以你需要做的就是接受一个包含你需要的所有东西的论据.例如:
trait Config {
def fly: FlyBehaviour
def quack: QuackBehaviour
}
type Env[A] = Config => A
Run Code Online (Sandbox Code Playgroud)
现在,如果您想Duck基于此环境构建一个:
val a: Env[Animal] = c => new Duck(c.fly, c.quack)
Run Code Online (Sandbox Code Playgroud)
然后构建一个Zoo基于这很容易:
val z: Env[Zoo] = a andThen (new Zoo(_))
Run Code Online (Sandbox Code Playgroud)
使用Scalaz(或者您自己的一些工作),您可以使用一些语法细节来"询问"配置c:
val z: Env[Zoo] = for {
c <- ask
} yield new Zoo(Duck(c.fly, c.quack))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4457 次 |
| 最近记录: |