2016-10-21 16 views
0

私はScalaでHaskellの "iterate"関数と同様の関数を記述しようとしています。値xと関数fが与えられたとき、反復はx、f(x)、f(x)などの値からなるストリームを返すはずです...スカラ無限反復関数

前方の適切なストリームを生成するためにどのように私は私のコードを修正することができ

(3行で)値の解像度の定義にまたがる参照

:私はそれをコンパイルしようとすると

object current { 
    def iterate[A](f: A => A, x: A): Stream[A] = { 
    val res: Stream[A] = x #:: res.map(f) 
    return res 
    } 

    def double(x: Int) = x * 2 

    def main(args: Array[String]): Unit = { 
    val str: Stream[Int] = iterate(double, 2) 
    } 
} 

は、私はエラーを取得します?

+0

http://stackoverflow.com/questions/35111887/scala-error-forward-reference-extends-over-:仕事への反復合成写像のための私のコードに最小限の変更は怠惰なキーワードを追加するだけです値の定義-code-appe –

答えて

3

私はあなたがこのような何か必要があると仮定します。私は、これはあなたが探しているものだと思います

def iterate[A](x: A)(f: A => A): Stream[A] = x #:: iterate(f(x))(f) 

scala> iterate(0)(_ + 1).take(10).force 
res0: scala.collection.immutable.Stream[Int] = Stream(0, 1, 2, 3, 4, 5, 6, 7, 8, 9) 
1

def iterate[A](f: A => A, x: A): Stream[A] = x #:: iterate(f, f(x)) 

が、より良い型推論のために、私はそれをこのように書きますが。

def iterate[A](f: A => A, x: A): Stream[A] = Stream.iterate[A](x)(f) 

これでこのように使用できます。

def double(x: Int): Int = x * 2 

def main(args: Array[String]): Unit = { 
    val str: Stream[Int] = iterate(double, 2).take(10) 
    str.foreach(print) 
} 
+0

私はあなたのソリューションを試しましたが、私はこのエラーメッセージが表示されます:値iterateはオブジェクトのメンバーではありませんストリーム – vkubicki

+0

本当ですか?ここにその方法があります。 https://github.com/scala/scala/blob/v2.11.8/src/library/scala/collection/immutable/Stream.scala#L1248 – Jegan

+0

これは私がホイールを再発明したことを意味します。少なくともそれは近いです。 –

2

ありがとうございます。

def iterate[A](f: A => A, x: A): Stream[A] = { 
    lazy val res: Stream[A] = x #:: res.map(f) 
    return res 
} 
関連する問題