我想在scala中编写一个memoize函数,无论函数对象是什么,它都可以应用于任何函数对象.我希望以一种允许我使用memoize的单个实现的方式这样做.我对语法很灵活,但理想情况下,memoize出现在非常接近函数声明的地方,而不是函数之后.我还想避免首先声明原始函数,然后再为memoized版本声明第二个声明.
所以一些理想的语法可能是这样的:
def slowFunction(<some args left intentionally vague>) = memoize {
// the original implementation of slow function
}
Run Code Online (Sandbox Code Playgroud)
甚至这是可以接受的:
def slowFUnction = memoize { <some args left intentionally vague> => {
// the original implementation of slow function
}}
Run Code Online (Sandbox Code Playgroud)
我已经看到了这样做的方法,其中必须为每个arity函数重新定义memoize,但我想避免这种方法.原因是我需要实现几十个类似于memoize的函数(即其他装饰器),要求每个arity函数都要复制每个函数太多了.
一种做memoize的方法确实需要你重复memoize声明(所以它没有用)是什么类型用于在Scala中存储内存中的可变数据表?.
scala将多个函数调用参数合并到一个元组中 - 这可以被禁用吗?讨论Scala创建一个绑定到一个arg函数的元组.这导致了
scala> println(1, 2)
(1,2)
Run Code Online (Sandbox Code Playgroud)
答案说编译器允许在没有parens的情况下调用一个arg函数,因此逻辑上这是对带有元组的println的调用.
但是不能使用单个元组参数调用println
scala> val t = (1, 2)
t: (Int, Int) = (1,2)
scala> println t
<console>:6: error: value t is not a member of Unit
println t
^
Run Code Online (Sandbox Code Playgroud)
所以其他事情正在发生.为什么元组在这里特别?
我突然遇到了这个(意想不到的)情况:
def method[T](x: T): T = x
scala> method(1)
res4: Int = 1
scala> method(1, 2)
res5: (Int, Int) = (1,2)
Run Code Online (Sandbox Code Playgroud)
为什么在两个或更多参数方法的情况下返回并推断出一个元组但是抛出关于参数列表的错误?是故意吗?也许这种现象有一个名字?