2015-03-05 17 views
7

Tôi đang cố gắng viết một hàm ẩn danh với tham số theo tên. Đây là những gì tôi mệt mỏi.scala Thông số bằng tên trên một chức năng ẩn danh

val fun = (x: Boolean, y: =>Int) => if(x) y else 0 

Lỗi này không thành công.

Error:(106, 31) identifier expected but '=>' found. 
    val fun = (x: Boolean, y: =>Int) => if(x) y else 0 
          ^
Error:(109, 3) ')' expected but '}' found. 
    } 
^

Mã giống như chức năng chuẩn hoạt động như thế nào.

def fun1(x: Boolean, y: =>Int) = if(x) y else 0 

Mọi con trỏ?

--------------- Chỉnh sửa -----------------

Tôi gặp sự cố hai phần. câu trả lời của senia giải quyết trường hợp ban đầu. Giả sử tôi có một hàm có chức năng.

def xxx[A,B](f:(A,=>B)=>B)={} 

Theo giải pháp senia, nó hoạt động.

val fun: (Int, =>Boolean) => Boolean = (x, y) => y 
xxx[Int,Boolean](fun) 

Tuy nhiên tôi muốn loại bỏ niềm vui trung gian và gọi xxx bằng chức năng ẩn danh. Làm

xxx((Int, =>Boolean) => Boolean = (x, y) => y) 

Sẽ không hoạt động. Bất kỳ ý tưởng làm thế nào để làm điều này?

Trả lời

9

Bạn có thể chỉ định loại chức năng ẩn danh, thay vì loại thông số như thế này:

val fun: (Boolean, => Int) => Int = (x, y) => if(x) y else 0 

scala> fun(false, {println("!"); 2}) 
res1: Int = 0 

scala> fun(true, {println("!"); 2}) 
! 
res2: Int = 2 

=> Int không phải là tên đúng loại, đó là một cú pháp đặc biệt cho từng tên tham số trong các thông số khối của phương pháp kê khai hoặc loại chức năng ẩn danh.

Xem SLS4.6 Khai báo hàm và định nghĩa

ParamType ::= Type 
      | ‘=>’ Type 
      | Type ‘*’ 

Trong trường hợp bạn không muốn gán chức năng ẩn danh để biến bạn có thể sử dụng một trong hai loại suy luận như thế này:

xxx[Int, Boolean]{ (x, y) => y } 

Hoặc chỉ định loại của nó theo cách này:

xxx({ (x, y) => y }: ((Int, => Boolean) => Boolean)) 
+0

Xin chào, Giải pháp của bạn hoạt động. Tuy nhiên tôi có một điều nữa. đã chỉnh sửa bài đăng gốc. Bạn có thể giúp tôi được không. –

+0

@SajithSilva: xem cập nhật – senia

+0

Cảm ơn sự trợ giúp thực sự phù hợp. –

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