什么是组合器以及如何在java中编写它们

时间:2014-12-21 10:39:02

标签: java scala functional-programming

我正在阅读这本书Fp In Scala,作者谈到了纯粹的功能状态。

例如,作者编写了这样的纯随机生成器(伪代码):

def newSeed = (this.seed * 0x5DEECE66DL + 0xBL) & 0xFFFFFFFFFFFFL
def obj = new RandomG(newSeed)
def n = newSeed >>> 16
[n,obj]

此处作者返回value (n)state (obj)。从返回的state我们可以获得给定种子的常量随机

后来作者说:

  

回顾我们的实现,我们会注意到一个共同的模式:   我们的每个函数都有一种形式RNG => (A,RNG)对某些人来说   类型A.此类型的函数称为状态操作或状态   转换是因为它们将RNG状态从一个转换为下一个。   可以使用组合器来组合这些状态动作   我们将在本节中定义的高阶函数。

他定义:

type Rand[+A] = RNG => (A, RNG)

combinators是这样的:

def unit[A](a: A): Rand[A] = rng => (a, rng)

由此我有两个问题:

  1. unit如何运作?我没有得到这个想法。
  2. 如何在Java中编写相同的unit
  3. 提前致谢。

1 个答案:

答案 0 :(得分:1)

unit只是一种将普通值a: A“包裹”为Rand[A]的方法,即函数RNG => (A, RNG),方法是返回{{1}未修改的。我不会真的称RNG为“组合者”(我保留该术语用于对函数进行操作的函数,如unitmap,并且您引用的段落似乎同意),但这个词对不同的人意味着不同的东西。

在Java中,遗憾的是我们没有类型别名或元组,因此我们必须明确定义类型:

traverse