【问题标题】:How to define scala type for no argument function?如何为无参数函数定义scala类型?
【发布时间】:2011-11-05 22:17:16
【问题描述】:

这行得通

def func(f: => Int) = f

这不会(例如在课堂内)

type EmptyFunct = => Int

 type EmptyFunct = (=> Int)

Scala 2.9 版 两个问题:

  1. 为什么语法糖在第二种情况下不起作用?
  2. 如何在没有语法糖的情况下定义这个函数?

【问题讨论】:

  • 您能否举一个使用EmptyFunct 的例子来说明为什么() => Unit 不符合您的需要?

标签: scala syntax-error scala-2.8


【解决方案1】:

=> Int 不完全是一个没有参数的函数,它是一个具有按名称调用传递约定的 Int 参数。 (当然,这是相当不错的一点,因为它是通过传递不带参数的函数来实现的)。

没有参数的函数写成() => Int。你可以做type EmptyFunct = () => Int

它不是一个类型。在 func 内部,f 将被输入为 Int。 () => Int 类型的参数不会。

def func(f: => Int) = f *2

func (: => Int) Int

但是

def func(f: () => Int) : Int = f*2

错误:值 * 不是 () => Int 的成员

【讨论】:

  • 所以没有办法创建没有 arg (: =>Unit) 函数的集合?
  • 查看我的回复:Collection[Function0[Unit]]
  • 如果您正在寻找 (: => Unit *) 重复参数,则不允许。实际上,这只能是 Seq[Unit] (Seq 包含值,而不是参数调用约定)。并且毫无用处。你想要的是 Seq[Function0[Unit]] (或 Seq[() => Unit],它的意思是一样的)。符号会不太方便:() => x += 1 而不是 x+= 1。
  • 定义一个集合:val c: List[()=>Unit] = List( () => println("hello"), () => println("world") ).
【解决方案2】:

你应该使用Function0

在第一种情况下它不起作用,因为您声明了一个非参数函数,而是因为您表明参数是按名称调用的。

【讨论】:

  • 这不是我的问题的解决方案。因为 Function0 实际上具有类型 () => T 而不是 (=> T),据我所知,它根本不起作用。
【解决方案3】:

我认为方法没有多大意义,返回一个 int,调用时不带参数。要么它返回一个常量,所以你可以使用这个常量,或者它会使用一个 var?

所以让我们使用 var:

var k = 10 
val fi = List (() => k * 2, () => k - 2)
val n = fi(0)
n.apply 
k = 11
n.apply

结果是 20,然后是 22。

【讨论】:

  • “我认为一个方法没有多大意义,返回一个 int,调用时没有参数。”计数器?
  • 或任何在创建阶段具有其所有上下文的回调函数
猜你喜欢
  • 1970-01-01
  • 2010-12-17
  • 2019-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-22
  • 2021-03-18
  • 2010-11-18
相关资源
最近更新 更多