2012-09-29 16 views
12

Przejmuję programowanie funkcjonalne Coursera w klasie Scala. To już drugi tydzień i uderzyłem w ścianę. W zadaniu pracujemy z zestawami, ale nie na przykład z zestawem, który wszyscy spotykamy na przykład w Javie. Jest to zestaw, który zwraca wartość true, jeśli wartość jest tam i false w przeciwnym razie. Mówią, że to nie pojemnik, to tylko funkcja.Pomoc przy przydziale: Związek między zestawami

Aby było jasne, potrzebuję twojej pomocy. Nie chcę, abyś rozwiązał moje zadanie, to tylko przykład, który chcę zrozumieć, co powinienem zrobić.

/** 
    * 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 = ??? 

To jest kod. W singletonSet domyślam się, że sposobem na rozwiązanie jest zwrócenie Set(elem), prawda?

Jeśli to dobrze, jak mam utworzyć związek między tymi dwoma? Nie jestem nowy w programowaniu, ale nie widzę sposobu, aby to zrobić. Ponieważ nie powinienem zwracać "zestawu" liczb.

Oto co inny student powiedział mi o zestawach: "Ale wszystko" Set "jest funkcją, która pobiera Int i zwraca wartość logiczną (Int => Boolean) .Każda funkcja, która pobiera Int i zwraca wartość Boolean pasuje typ „Ustaw” "

Co próbowałem w funkcji związkowej jest mieć coś takiego:.

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

Każda pomoc będzie mile widziane :)

+0

Ciekawe, że http://stackoverflow.com/questions/13052735/is-my-understanding-of-below-scala-code-correct to zasadniczo to samo pytanie, które pozostaje otwarte. IMO powinny być otwarte, ponieważ są to ważne pytania. – talonx

Odpowiedz

35

Wygląda na to, że ściana, którą uderzasz, nie jest ci znana z definiowania funkcji w Scali. W tym konkretnym przypadku musisz zdefiniować funkcje typu Int => Boolean, pobierają one Int i zwracają Boolean.

Oto kilka przykładów literałów funkcjonalnych typu Int => Boolean. Wypróbuj je w konsoli Scala lub arkuszu 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 

Następnie wszystko co musisz zrobić dla przypisania jest użycie tej samej składni, począwszy (x: Int) => a następnie przetłumaczyć sens unii, przecinają się, .. po prawej stronie wyrażenia.

Część nauki to prawdziwy wysiłek. Wierzę, że możesz ponownie przesłać to rozwiązanie wiele razy, więc nie wahaj się przesłać i powtórzyć, jeśli nie otrzymasz 10/10 za pierwszym razem. Wszystko czego potrzebujesz to kompilacja kodu. Powodzenia!

+1

pomogło to. Dzięki. Byłoby łatwiej, gdybym miał taką odpowiedź wcześniej. Odkryłem na własną rękę, jak to zrobić po wielu godzinach prób i kilku innych odpowiedziach (które tak naprawdę nie ujawniły odpowiedzi) :) – Andrew

+2

To nie znaczy, że nie doceniam twojej odpowiedzi. Wręcz przeciwnie, bardzo dziękuję – Andrew

+0

Przepraszamy za komentowanie nieaktywnego wątku. Ale czy istnieje artykuł lub film, w którym mogę lepiej zrozumieć ten problem? Wszystko, co widzę, to logika abstrakcji, ale nie jestem zbyt zaznajomiona ze scala i chciałbym zrozumieć problem, zanim spróbuję go rozwiązać. – kromastorm

8

Możliwym jest podpowiedź spójrz na typy. Spójrz na typ Set. Jest to właściwie alias typu funkcji od Int do Boolean.

Tak więc, kiedy masz dwa zestawy, masz dwie funkcje. Jak możesz ich użyć, aby zapewnić funkcję reprezentującą związek tych zestawów? To musi być twój punkt wyjścia.

+0

Zrobiłbym OR między dwiema funkcjami, ale potrzebowałbym też X. Nie mogę znaleźć lepszej odpowiedzi. – Andrew

+1

Zapomniałeś ważniejszego faktu: 'Set' jest aliasem dla funkcji. Twoje 'X' pochodzi z tego: musisz zwrócić funkcję, która wyjaśnia, co zrobić z" zewnętrznym "' X'. – Nicolas

+0

, więc jest to OR między 2 zestawami?Próbowałem tego i nie działa, aby mieć "s | t", mówi "wartość | nie jest członkiem Int => Boolean". – Andrew

Powiązane problemy