2012-06-10 63 views
10

我有几个有关咖喱功能的问题。在这里,我要求他们一个接一个斯卡拉咖喱功能相关的问题

1)http://twitter.github.com/scala_school/basics.html给出了一个curried函数的例子 - 我认为这是一个函数定义,但事实上并非如此。 REPL根本不承认这是一个有效的陈述。

multiplyThenFilter { m: Int => m * 2 } { n: Int => n < 5} 

2)为什么我们不能从部分参数化的方法定义函数?即以下定义出了什么问题?

scala> def multiply(m: Int, n: Int): Int = m * n 
multiply: (m: Int, n: Int)Int 

scala> val timesTwo = multiply(2,_) 
<console>:11: error: missing parameter type for expanded function ((x$1) => multiply(2, x$1)) 
     val timesTwo = multiply(2,_) 
           ^

3)为什么我们不能创建一个部分参数化的函数curry?即以下定义出了什么问题?

scala> (multiply(_,_)).curried 
    res13: Int => (Int => Int) = <function1> // THIS IS OK 

scala> (multiply(20,_)).curried 
<console>:12: error: missing parameter type for expanded function ((x$1) => multiply(20, x$1)) 
       (multiply(20,_)).curried 
         ^
+0

1)它是无效的,因为它必须首先声明。例如,像这样:'def multiplyThenFilter(a:Int => Int)(b:Int => Boolean)= {List(1,2,3,4).map(a)。过滤器(b)}' –

+0

1)multiplyThenFilter现在不见了。你是不是被它迷惑:-) –

回答

11

问题1

斯卡拉学校例子混乱,这绝对不是一个定义。在GitHub上打开它的an issue,所以也许这是一个错误。你能想象一个合理的解释可能是这样的:

def multiplyThenFilter(f: Int => Int)(p: Int => Boolean): Int => Option[Int] = { 
    i => 
    val j = f(i) 
    if (p(j)) Some(j) else None 
} 

(或等同,f andThen (Some(_) filter p)。)

那么例子是双打其输入并返回结果的Some如果它是一个功能小于5,否则为None。但是,除非对此问题有所回应,否则没人确切知道作者的意图。


问题2

timesTwo不工作仅仅是Scala的编译器不支持那种类型的推理,见this questionmy answer there了一下相关细节的原因。你需要去与下列之一:

def multiply(m: Int, n: Int): Int = m * n  
val timesTwo = multiply(2, _: Int) 

def multiply(m: Int)(n: Int): Int = m * n  
val timesTwo = multiply(2) _ 

即,如果你想在这里的类型推断,你需要使用多个参数列表。否则,你必须帮助编译器解决这个问题。


问题3

关于第三个问题,假设我们有以下的,以避免在您的第二个问题的问题:

val timesTwo = multiply(2, _: Int) 

这是一个Function1,刚刚没有按”没有curried方法 - 你需要一个Function2(或Function3等)。

只用一个参数来讨论一个函数就没有意义。 Currying接受一个具有多个参数的函数,并为您提供一个函数,它接受一个返回另一个函数的单个参数(它本身可能接受一个参数并返回另一个函数等)。

+0

的唯一的人是两个功能“timesTwo”中定义为“VAL timesTwo =乘(2,_:智力)”和“VAL timesTwo =乘(2)_”在你的答案问题2与同一类型? – chen

+0

是的,它们都是'Int => Int'(或者等价于'Function1 [Int,Int]')。 –