13

私は Scala クラスで Coursera 関数型プログラミングを取っています。2週目で壁にぶち当たりました。この課題ではセットを扱っていますが、たとえば Java で遭遇する種類のセットではありません。値がそこにある場合は true を返し、そうでない場合は false を返す Set です。彼らは、それはコンテナではなく、ただの機能だと言います。

明確にするために、あなたの助けが必要です。私はあなたに私の課題を解決してほしくありません。これは、私が何をすべきかを理解してもらいたいという単なる例です。

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

これがコードです。それsingletonSetを解決する方法は、を返すことだと思いますよねSet(elem)

それでよろしければ、どうすれば両者を結びつけることができますか? 私はプログラミングが初めてではありませんが、それを行う方法がわかりません。数値の「セット」を返すべきではないためです。

これは、別の学生がセットについて私に言ったことです: "しかし、すべての「セット」は、Int を取り、ブール値を返す関数です (Int => Boolean)。Int を取り、ブール値を返す関数は、その型に適合します 'セット」

ユニオン関数で試したのは、次のようなものです。

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

どんな助けでも大歓迎です:)

4

2 に答える 2

35

あなたがぶつかっている壁は、Scala で関数を定義することに慣れていないことです。この特定のケースでは、 type の関数を定義する必要があります。Int => Booleanそれらは を取り、Intを返しますBoolean

タイプ の関数リテラルの例をいくつか示しますInt => Boolean。Scala コンソールまたは 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

次に、割り当てのために行う必要があるのは、同じ構文を使用して、(x: Int) =>結合、交差、... の意味を式の右側に変換することだけです。

学習の一部は、真の努力をすることです。解決策は何度でも再提出できると思いますので、最初の試行で 10/10 にならない場合は、躊躇せずに提出して繰り返してください。必要なのはコードをコンパイルすることだけです。幸運を!

于 2012-09-29T14:43:27.827 に答える
8

考えられるヒントは、型を見ることです。タイプを見てくださいSet。実際には関数 from Intintoの型エイリアスBooleanです。

したがって、2 つのセットがある場合、実際には 2 つの機能があります。これらの Set の結合を表す関数を提供するために、それらをどのように使用できますか? それはあなたの出発点でなければなりません。

于 2012-09-29T08:37:02.743 に答える