2012-09-29 36 views
12

Tôi đang tham gia Lập trình chức năng Coursera trong lớp Scala. Đây là tuần thứ hai và tôi đâm vào tường. Trong bài tập, chúng tôi đang làm việc với Sets, nhưng không phải là loại Set chúng ta gặp trong Java, ví dụ. Nó là một Set trả về true nếu giá trị nằm trong đó và sai khác. Họ nói nó không phải là một container, nó chỉ là một chức năng.Trợ giúp chuyển nhượng: Liên kết giữa các bộ

Để làm rõ, tôi cần sự giúp đỡ của bạn. Tôi không muốn bạn giải quyết bài tập của tôi, nó chỉ là một ví dụ mà tôi muốn có được ý tưởng về những gì tôi nên làm.

/** 
    * We represent a set by its characteristic function, i.e. 
    * its `contains` predicate. 
    */ 
    type Set = Int => Boolean 

/** 
    * Indicates whether a set contains a given element. 
    */ 
    def contains(s: Set, elem: Int): Boolean = s(elem) 

/** 
    * Returns the set of the one given element. 
    */ 
    def singletonSet(elem: Int): Set = Set(elem) 

/** 
    * Returns the union of the two given sets, 
    * the sets of all elements that are in either `s` or `t`. 
    */ 
    def union(s: Set, t: Set): Set = ??? 

Đây là mã. Trong singletonSet Tôi đoán cách để giải quyết nó là trả lại Set(elem), phải không?

Nếu điều đó tốt, làm thế nào tôi có thể làm cho sự kết hợp giữa hai người? Tôi không phải là người mới để lập trình nhưng tôi không thể thấy bất kỳ cách nào để làm điều đó. Vì tôi không nên trả lại một "bộ" số.

Đây là những gì một sinh viên khác đã nói với tôi về các bộ: "Nhưng tất cả" Set "là một hàm lấy Int và trả về một hàm Boolean (Int => Boolean). boolean phù hợp với loại 'Set' "

gì tôi đã cố gắng trong hàm công đoàn là phải có cái gì đó như:.

def union(s: Set, t: Set): Set = (s | t) //value | not a member of Int => Boolean 

Bất kỳ trợ giúp sẽ được đánh giá cao :)

+0

Tò mò rằng http://stackoverflow.com/questions/13052735/is-my-understanding-of-below-scala-code-correct về cơ bản là cùng một câu hỏi và nó vẫn mở. IMO cả hai nên được mở vì chúng là câu hỏi hợp lệ. – talonx

Trả lời

35

Có vẻ như bức tường bạn đang chạm là bạn không quen với việc xác định các chức năng trong Scala. Trong trường hợp cụ thể này, bạn cần phải xác định các chức năng của loại Int => Boolean, chúng mất Int và trả về một Boolean.

Dưới đây là một số ví dụ về các hàm số của loại Int => Boolean. Hãy thử chúng trong Scala console hoặc bảng Scala IDE:

(x: Int) => true 
(x: Int) => false 
(x: Int) => x == 2 
(x: Int) => x == 10 
(x: Int) => x == 2 || x == 10 
(x: Int) => x % 2 == 0 

Sau đó, tất cả các bạn phải làm cho nhiệm vụ là sử dụng cú pháp tương tự, bắt đầu với (x: Int) => và sau đó dịch ý nghĩa của công đoàn, giao nhau, .. vào bên phải của biểu thức.

Một phần của việc học là tạo cho nó một nỗ lực thực sự. Tôi tin rằng bạn có thể gửi lại giải pháp nhiều lần, vì vậy đừng ngần ngại gửi và lặp lại nếu bạn không nhận được 10/10 lần thử đầu tiên. Tất cả những gì bạn cần là biên dịch mã. Chúc may mắn!

+1

điều này đã giúp ích. Cảm ơn. Sẽ dễ dàng hơn nếu tôi có câu trả lời như thế này trước đó. Tôi tự khám phá ra cách làm điều này sau nhiều giờ cố gắng và một vài câu trả lời khác (không thực sự tiết lộ câu trả lời) :) – Andrew

+2

Điều đó không có nghĩa là tôi không đánh giá cao câu trả lời của bạn. Ngược lại, cảm ơn bạn rất nhiều – Andrew

+0

Xin lỗi vì đã bình luận về một chủ đề không hoạt động. Nhưng có một bài viết hay video mà tôi có thể hiểu vấn đề này tốt hơn không? Tất cả những gì tôi thấy là logic trừu tượng nhưng tôi không quá quen thuộc với scala và muốn hiểu vấn đề trước khi cố gắng giải quyết nó. – kromastorm

8

Một gợi ý có thể là nhìn vào các loại. Nhìn vào loại Set. Nó thực sự là một bí danh loại cho một hàm từ Int thành Boolean.

Vì vậy, khi bạn có hai bộ, bạn thực sự có hai chức năng. Làm thế nào bạn có thể sử dụng chúng để cung cấp một hàm đại diện cho sự kết hợp của các Set này? Nó phải là điểm khởi đầu của bạn.

+0

Tôi sẽ làm một OR giữa hai chức năng, nhưng tôi cũng cần một X. Tôi không thể có được một câu trả lời tốt hơn. – Andrew

+1

Bạn quên thực tế quan trọng hơn: 'Set' là bí danh cho hàm. 'X' của bạn xuất phát từ nó: bạn phải trả về một hàm, giải thích phải làm gì với' X' bên ngoài. – Nicolas

+0

vì vậy nó là một OR giữa 2 bộ?Tôi đã thử điều này và nó không hoạt động để có "s | t", nó nói "giá trị | không phải là thành viên của Int => Boolean". – Andrew

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