【发布时间】:2013-06-06 02:51:04
【问题描述】:
我有点挣扎:我需要一个可以接受任何函数的函数 fun(Any*) 类型:布尔值作为参数,计算函数并返回 true 或 false,取决于函数评估的成功。
本质上,我需要的是一个函数类型,它允许任何数量和任何类型的参数,但该函数必须返回布尔值。
这将允许我编写如下函数:
def checkLenght(str : String, length : Int) : Boolean ={
if (str.lenght == length)}
或
def ceckAB(a : Int, b : Int) : Boolean = {
if(a < b && a >= 23 && b < 42) }
这样,例如
eval(checkLenght(abc, 3)) //returns true
eval(ceckAB(4,1)) // returns false
我想,一个函数类型:
type CheckFunction = (Any*) => Boolean
可能会成功,但我在编写通用 eval 函数时遇到了困难。
有什么建议吗?
谢谢
解决办法:
该功能需要 1) 另一个返回类型为 Boolean 的函数:“(func : => Boolean)” 2)返回类型布尔“:布尔” 3) 返回传递的函数参数的值:“= func”
总的功能是:
def eval(func : => Boolean) : Boolean = func
让我再次惊讶于 Scala 中的简单事物是多么简单。
正如 cmets 所指出的,这是一个相当不寻常的功能,没有明显的 感觉。简单说一下根本原因。
动机:
有很多关于潜在动机的问题,所以这里简短 总结为什么需要这样的功能。
基本上有两个原因。
第一个是关于将故障处理从函数本身移开 进入处理函数。这保留了检查功能的纯度,甚至允许 重用通用检查。
其次,这一切都与“可插拔故障处理”有关。这意味着,只有 eval 函数 告诉是否发生了故障(或没有发生)。如果发生故障,则通过接口调用处理程序。可以根据需要使用配置文件交换处理程序的实现。
为什么?
交换配置文件意味着,我像往常一样编写我的检查和功能,但通过切换 配置文件,我切换处理程序,这意味着我可以在句号、控制台打印输出、电子邮件警报、SNMP 通知、推送消息之间进行选择......你可以命名它。为此,我需要将检查函数与其评估和处理分离。这就是这种看起来相当奇怪的 eval 函数的动机。
为了完整起见,我已经实现了所有这些东西,但我是否面临只处理琐碎检查的限制,即 check(Boolean*) 这很简洁,但我通常更愿意编写一个函数来做更多事情复杂的检查。
已解决
通过返回传递函数的值来定义函数:
def eval(func : => Boolean) : Boolean = {func}
【问题讨论】:
-
在您的示例中,eval 函数不会做任何事情:您将布尔值(函数调用)作为参数传递给它,它返回相同的布尔值...
-
问题不清楚。您的问题的性质如何使您无法简单地应用您定义的布尔值函数?如果你想提供参数但延迟实际评估,你可以让你的函数有一个额外的单位类型的咖喱参数;那么
eval将是(Unit => boolean) => boolean定义为f => f()。不是很有趣。 -
我同意之前所说的;如果您想要做的只是返回您传入的函数调用返回的值,那么
eval只是作用域为Boolean类型值的identity函数,所以这很好:val eval = identity[Boolean] _跨度> -
Wilfried,我觉得你的解决方案很有趣。身份[T] 是否在 predef 中定义?这是我第一次看到。