是否有()=>函数的名称?一个?

时间:2014-07-25 17:35:28

标签: scala functional-programming

我正在探索随机生成的值,我想知道模式/名称是否已存在于概念中。我有一个功能(和特征),其签名如下

trait Generator[A] { // good name?
  def generate: A

  // alternatively () => A
}

它类似于随机数发生器的工作方式。

val rng = new util.Random

val randInt = rng.nextInt

我应该调用我的nextWidget而不是生成吗?

2 个答案:

答案 0 :(得分:4)

这完全取决于操作的语义。您可以将util.Random视为随机值的来源,在该上下文中,nextInt这样的名称是有意义的。如果方法是从文件或数据库中读取,我会发现像nextFoo这样的名称有点误导,可能更喜欢loadFoo之类的东西。在其他情况下,getFoogenerateFooinitFoocreateFoo可能会更有意义。

三个快速注释:

如果您的方法有副作用(例如Random.nextInt()),那么遵循约定并将其写为def generate(): Whatever(注意括号)是很好的。无论如何,eta扩展函数都是() => Whatever

值得注意的是() => AFunction0[A]的语法糖,这些有时被称为“nullary函数”。

最后:我知道def generate[A]: A可能仅仅是一个示例,但如果没有,您可能想要考虑约束类型A的方法。 def generate[A]: A说“告诉我任何类型,我会给你一个类型的值”,这是不可能以有用的方式实现的。

答案 1 :(得分:0)

有些人可能会称之为枚举器或迭代器:http://channel9.msdn.com/Events/Lang-NEXT/Lang-NEXT-2014/Keynote-Duality

new Iterator[A]{
    def hasNext: Boolean = true
    def next(): A = ???
}

有些人可能称之为供应商:http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Supplier.html

或者只是一个吸气剂:

trait Getter[A] {
    def get(): A
}

其他建筑商,工厂,供应商或......发电机。语境在这里是王道。我将使用最能描述其预期实现的内容。