8.29.2013

Scala: Making List of the Result of 'n' Times Function Calls with Stream

Scala: 関数をn回適用した結果のリストを作る

 

scala.collection.immutable.Stream を使うと簡単にできる。

以下は、適当な文字列の左右を「#」で囲む関数を 1回, 2回, ... と適用した結果をリストにして返す例。
(Scala 2.10, REPLで実行) 

 

scala> def f(s: String) = s"#${s}#"
f: (s: String)String

scala> def g(s: String): Stream[String] = s #:: g(f(s))
g: (s: String)Stream[String]

scala> g("x").tail.take(5).toList
res0: List[String] = List(#x#, ##x##, ###x###, ####x####, #####x#####)

 

 

2013-08-30 追記

今回の目的であれば、iterate メソッドを使った方が適しているとご指摘をいただきました。
List#iterate, Iterator#iterate, Stream#iterate を使った例です。 

scala> def f(s: String) = s"#${s}#"
f: (s: String)String

scala> List.iterate(f("x"), 5)(f)
res0: List[String] = List(#x#, ##x##, ###x###, ####x####, #####x#####)

scala> Iterator.iterate("x")(f).drop(1).take(5).toList
res19: List[String] = List(#x#, ##x##, ###x###, ####x####, #####x#####)

scala> Stream.iterate("x")(f).tail.take(5).toList
res26: List[String] = List(#x#, ##x##, ###x###, ####x####, #####x#####)

こちらの方が素敵ですね。

2 コメント:

  1. iterate使えば

    返信削除
  2. コメントありがとうございます。追記してみました。

    返信削除