【问题标题】:Scala: why doesn't List[=>Int] work?Scala:为什么 List[=>Int] 不起作用?
【发布时间】:2013-01-01 04:46:17
【问题描述】:

我一直在努力学习 scala 的来龙去脉,最近我遇到了一些我很好奇的事情。

据我了解,如果我想将一个有效延迟评估的代码块传递给一个函数,(而不是当场评估它)我可以输入:

def run(a: =>Int):Int = {...}

从这个意义上说,函数 run 接收一个尚未被计算的代码块,它计算并返回计算出的 Int。然后我尝试将这个想法扩展到 List 数据结构。打字:

def run(a: List[=>Int]) = {...} 

但是,这会返回错误。我想知道为什么不允许这样做。除了通过这种语法之外,我如何传递未评估的代码块列表?

【问题讨论】:

    标签: scala lazy-evaluation


    【解决方案1】:

    =>Int 是按名称参数的语法。 =>Int 不是类型,因此不能用作List 的参数。但是,()=>Int 是一种类型。它是返回Int 的空函数类型。所以这行得通:

    def run(a: List[()=>Int]) = {...} 
    

    【讨论】:

    • 啊!那应该可以,谢谢金的回答。顺便说一句,JVM 是否将匿名函数(例如存储在上述列表中的函数)放入堆中?
    • 是的,它们存储在堆上。
    【解决方案2】:

    【讨论】:

    • 另一种选择是使用Stream,这也是一种惰性数据结构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 2018-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多