2017-03-31 9 views
-1

私は実際に何をこの質問と呼ぶべきか分かりません。提示されたタイトルは私が思いつくことができる最高でした。Scalaの型エイリアシング

私たちは現在、学校でScalaの関数型プログラミングに取り組んでいます。私はよく慣れ親しんでいるものの中で何かが意味をなさないケースがいくつかあります。 :

type Rand[+A] = RNG => (A, RNG) 

val int: Rand[Int] = _.nextInt 

def unit[A](a: A): Rand[A] = 
    rng => (a, rng) 

私たちは私たちのRNG形質を使用して新しい乱数を生成している各機能に毎回新しい状態を転送することの繰り返しに対抗しようと、ここでの状態を扱っています。

私の質問はこれです:

ラムダ関数式は、私たちの状態のプレースホルダーとして使用されるように、「rng =>」述語を定義します。通常、この述部が定義するものは、List.map(x => x)のように明確です。ここで、xはリストの各要素です。しかし、それは私には分かりませんrngはここにあります。

編集:私はランド[A]が表現されたものを求めていないよ

...一部の人々は私は明確にするために、ここでいくつかのさらなる例を与える質問を理解していなかったと思います。私は上記のマップの例では例えば

...受け取った引数 rng =>は次のように解釈されることになっているもの
def map[A,B](l: List[A])(f: A => B): List[B] = ... 
val l = List(1,2,3,4,5) 
// l.map(x => x+1) -> List(2,3,4,5,6) 

を求めています、概念的に受け取った引数x =>が関数によって与えられたことを理解することが非常に簡単です引数fはリストlの個々の要素として解釈されます。

具体的にはrng =>の概念的な接続をunitに探しています。

+0

'rng'はちょうど別の' x'または '_'です。受け取った議論です。この場合、 'RNG'型のarg/parameterです。型 'Rand'は' RNG'を受け取りタプルを生成する関数です。 – jwvh

答えて

4

OK、私はそれに行きます。

def unit[A](a: A): Rand[A] = rng => (a, rng) 

unitは1つの引数をとり、タプルの半分を作成します。完成したタプルを構築する手段を返します。なぜならタイプRandの定義のすぐ

val uHalf = unit('q') // this is the "a" parameter 

、タプルの他の半分は、あなたのコード例で定義されていないタイプRNG、とすることができる(及びuHalfRandです)。しかしblobタイプがRNGであるとしましょう。

val tup = uHalf(blob) // this is the "rng" parameter 

ここでタプル('q', blob)があります。

List(3,2,1).map(x => ...の例ではxListから提供される値のスタンドです。 Randの場合は、という値のスタンドインで、後でコードのどこかに格納されます。

+0

これは私にそれを理解するのに役立った。私はそれがカレー化された方法で使用されることを認識していませんでした(ハーフ・ア・ランドと言います)。ありがとう!あなたは本当に頭の爪に当たった。 – user3407764