【发布时间】:2013-07-25 19:18:07
【问题描述】:
我希望能够将一个函数传递给一个类,这样该函数总是返回一个布尔值,但参数的数量可以是可变的。
这实际上是我现在正在使用的:
/**
* Template class for any SecureSocial SecuredAction.
*/
class SomeAction[T](
isSuccessful: (SecuredRequest[AnyContent], T) => Boolean,
success: Result,
failure: Result) extends SecureSocial {
def toReturn = SecuredAction(WithProvider("google")) {
implicit request => if (isSuccessful(request)) success else failure
}
}
我希望 isSuccessful 参数是一个函数,它至少接受一个 SecuredRequest[AnyContent] 类型的参数,然后是零个或多个参数。有时我会传入一个只需要request 对象的函数,有时我会传入一个需要request 对象和一些其他参数的函数。
在seeing this answer 之后,我查看了currying,即the practice of transforming a multiple-argument function into a single-argument function that will return a function if any more arguments are needed。这听起来可以解决我的问题,但是在阅读了difference between partially applied functions and currying 之后,我开始不这么认为了?看起来仍然有一定数量的最终参数......
我想成功的柯里化应该是这样的:
class SomeAction[T](
isSuccessful : ((SecuredRequest[AnyContent])(T) => Boolean) , // ERROR
... ) ... { ... }
这绝对不是正确的语法。
或
class SomeAction[T](
isSuccessful : (SecuredRequest[AnyContent] => Boolean) ,
... ) ... { ... }
对toReturn 中的isSuccessful 执行某些操作,以取消对传递的函数的curry。
可能会引导我回答的多个问题:
- 是否有一些特殊的语法来描述我不知道的柯里化函数?
- 或者我有一个类型为
(SecuredRequest[AnyContent] => Boolean)的函数,但在isSuccessful(request)调用上做一些非currying?
感谢阅读;我想我只是在寻找简单的例子。
【问题讨论】:
-
为什么不让您的来电者这样做?如果您要求函数
SecuredRequest[AnyContent] => Boolean,调用者可以处理部分应用任何其他参数。反正你也不知道要传递什么,对吧? -
谢谢@Myserious Dan!是的,这解决了我的问题^.^