2012-02-24 37 views
5

Tại sao tôi không thể viết lạiáp dụng Scala một phần chức năng cà ri

println(abc.foldRight(0)((a,b) => math.max(a.length,b))) 

trong

object Main { 
    def main(args : Array[String]) { 
    val abc = Array[String]("a","abc","erfgg","r") 
    println(abc.foldRight(0)((a,b) => math.max(a.length,b))) 
    } 
} 

để

println(abc.foldRight(0)(math.max(_.length,_))) 

? scala sản lượng phiên dịch

/path/to/Main.scala:4: error: wrong number of parameters; expected = 2 
    println(abc.foldRight(0)(math.max(_.length,_))) 
            ^
one error found 

Điều này không đủ mô tả cho tôi. Không phải là kết quả lambda có hai tham số một trong số đó được gọi cho phương pháp .length, như trong abc.map(_.length)?

+0

Sử dụng hai _ trình biên dịch sẽ biết tham số nào thay thế cho giá trị _ đầu tiên và thứ hai từ a, b? –

+0

Repsectivly, tôi nghĩ –

Trả lời

9

abc.foldRight(0)(math.max(_.length, _)) sẽ mở rộng thành cái gì đó như abc.foldRight(0)(y => math.max(x => x.length, y)). Cú pháp của trình giữ chỗ mở rộng trong cặp ngoặc đơn đóng gần nhất, trừ khi bạn chỉ có dấu gạch dưới trong trường hợp đó nó sẽ mở rộng ra bên ngoài cặp dấu ngoặc đơn gần nhất.

Bạn có thể sử dụng abc.foldRight(0)(_.length max _) không bị hạn chế này.

+0

Cảm ơn bạn! Câu trả lời này đã giúp tôi. –

Các vấn đề liên quan