2012-10-01 27 views
37

Tôi đang cố gắng sử dụng sự phủ định của một hàm boolean trong Scala, chẳng hạn như:Làm thế nào để sử dụng/tham khảo phủ định của một hàm boolean trong Scala?

def someFunction(x: Set, p: Int => Boolean): Boolean = 
    someOtherFunction(x, !p) 

Nhưng tôi nhận được lỗi:

value unary_! is not a member of Int => Boolean 

Làm thế nào tôi có thể tham khảo sự phủ định của p?

+6

Coursera Khóa học;): D – Montaro

+0

cousera lớp scala đời :) – CuiPengFei

Trả lời

51

Phủ định p là một hàm áp dụng p cho đối số của nó và phủ nhận kết quả.

x => !p(x) 

Nếu bạn muốn để có thể viết !p hoặc p && q bạn có thể sử dụng this library, mà chủ chứa chức năng mà trả về một bool với toán tử logic khác nhau.

+1

Nó trông giống như một thư viện tốt đẹp, tuy nhiên tôi có một ràng buộc ngăn cản việc sử dụng một thư viện như vậy: Tôi đang cố gắng hoàn thành một trong những bài tập của lớp Scala Coursera của Giáo sư Odersky và tôi stuk vào thời điểm này bởi vì tôi không thể đơn giản vượt qua sự phủ nhận của p chức năng cho một chức năng khác. Có thể làm điều đó ở Scala trơn tru không? –

+0

Tôi đã nói với bạn làm thế nào để làm điều đó trong scala đồng bằng trong phần đầu tiên của câu trả lời ... –

+0

Tôi xin lỗi vì sự hiểu lầm, bạn là đúng. Tôi chấp nhận câu trả lời của bạn. –

3

Một cách khác để giải quyết nó mà không cần sử dụng hàm ẩn danh là xác định hàm cụ thể cho tác vụ này.

def even(x:Int):Boolean = x%2==0 
def not(f: Int => Boolean): Int => Boolean = !f(_) 
def odd = not(even) 
odd(1) // true 
odd(2) // false 

Bạn cũng có thể xác định! chính mình

def even: Int => Boolean = _%2==0 
implicit def bangy(f: Int => Boolean) = new { def unary_! : Int => Boolean = !f(_) } 
def odd = !even 
odd(1) // true 
odd(2) // false 

nhưng điều này dường như chỉ hoạt động đối với các chức năng kiểu Int => Boolean, chứ không phải (Int) => Boolean. Giải pháp không (thậm chí) hoạt động với cả hai.

13

phủ Shortest của p: p (_)

Khi bạn áp dụng các vị p như một đối số chức năng khác:

  • p hay p (_) là chữ viết tắt của sự xuất hiện lambda: (x) => p (x)
  • ! p (_) là từ viết tắt của lambda expresion: (x) =>! p (x) và chỉ với! p trình biên dịch bị mất.

Ví dụ, sử dụng một tập các số nguyên (thử nó trên một bảng Scala):

def someOtherFunction (x: Set[Int], p: Int => Boolean):Boolean = x.forall(p) 
    def someFunction(x: Set[Int], p: Int => Boolean): Boolean = 
    someOtherFunction(x, !p(_)) 

    val x = Set(1,2,3) 
    var p: Int => Boolean = (_ > 0) 
    //_ > 0 is an abbreviaton of (x) => x > 0 

    someFunction(x, p)  //false 
    someOtherFunction(x, p) //true 

    p = _ > 1 
    someFunction(x, p)  //false 
    someOtherFunction(x, p) //false 

    p = _ > 3 
    someFunction(x, p)  //true 
    someOtherFunction(x, p) //false 
    println 
+0

Tôi đã nối thêm println vì trên Eclipse Scala của tôi, tôi không thể đánh giá một trang tính nếu câu cuối cùng có một nhận xét nội tuyến. –

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