2016-07-19 6 views
1

私はちょうどMartin OdeskyのCourseraコースからスカラーの学習を始めました。私は機能的な問題に本当に苦しんでいます。私はキャッチすることはできませんよ事は組合が、私は基本的にInt iを取り、iがセットであるか否かをチェックするためにa(i) || b(i)を呼び出す関数を返す午前組合法では機能セット/適用方法

object Functionalset { 
    type Set = Int => Boolean 
    def singletonSet(element: Int): Set = i => element == i 
    def union(a: Set, b: Set): Set = i => a(i) || b(i) 

    def main(args:Array[String]): Unit = { 
    print(singletonSet(2)(4)); 
    } 
} 

をMETHOD-です。 applyメソッドはどこにも定義されていません。 a(i)の機能は何ですか?それはsingletonSet(element:Int):Setと呼ばれますか?もしそうなら、どのように?

答えて

1

a(i)とは何ですか?それはsingletonSet(element: Int)

という2つの方法の間には関係がありません。この特定の場合のa(i)は、IntからBooleanまでの関数である、aという関数の呼び出しです。


aBooleanからIntから関数(スカラ構文糖とInt => Boolean)用タイプエイリアスあるタイプSetのです。このようなことの

思う:a以来

def union(a: Int => Boolean, b: Int => Boolean): Int => Boolean = i => a(i) || b(i) 

はタイプFunction1[Int, Boolean]の関数であり、そのためbがあり、単にiの渡された値を持つ関数を呼び出しているa(i)を呼び出します。さて、どのような混乱することができることの表記されています。あなたはsingletonSet(2)(4)を呼び出すとき、それは渡されるすべての将来Intためプレースホルダを自身が機能を返しunionので

i => a(i) || b(i) 

必要があり、これは、起こります我々はそれを少しdesugarize場合、あなたが持っている:あなたが最初の呼び出しを行う際の方法の2つの段階呼び出しとして、それの

val intermidiateFunction: Int => Boolean = singletonSet(2) 
val result: Boolean = intermidiateFunction(4) 

と思いますが、あなたは別の関数バックを得るを呼び出して、2回目の呼び出し時にのみ生成された関数の結果を返します。


のはunionを起動し、何が起こるか見てみましょう:

scala> union(i => i < 3, i => i > 1) 
res6: Set = <function1> 

scala> val result = union(i => i < 3, i => i > 1) 
result: Set = <function1> 

scala> result(1) 
res7: Boolean = true 

unionは、2つの機能に渡すために私たちを必要とするので、私たちはIntが1より3よりも小さいか大きいかどうかを確認し、これらの簡素化関数を作成します最初の呼び出しの結果自体が関数です。 Intを結果に渡すと、result(1)のように1 < 3 || 1 > 1になります。これはa(i) || b(i)と等価です。aが最初の関数で、bが2番目の関数です。

1

このラボでは、セットはcharacteristic functionと定義されています。 これは、に変換:SetIntを取り返す関数は単純であることを意味する

type Set = Int => Boolean 

Boolean(これは設定、指定された整数がセット内にあるかどうかを指示オラクルの特性関数でありますか否か)。

はあなたの変数aは、Setているので、a(i)iIntであれば、明確に定義されている、機能Int => Booleanです。

2つの集合の和集合の特徴的な関数は、その引数が2つの集合の一方にある場合に真を返し、そうでない場合に偽を返す関数です。