3

の一般的なタイプはfs何ですか?

 lazy val fs  = List(2,3,4).zip(fs.tail)

コンパイラは、コンパイル時にそれを設定するよう求めます。

更新: 2番目のプロジェクト オイラー問題の解決策を検討したかった:

    lazy val fs: Stream[Int] =
      0 #:: 1 #:: fs.zip(fs.tail).map(p => p._1 + p._2)

   fs.view.takeWhile(_ <= 4000000).filter(_ % 2 == 0).sum

これらのステップで何が起こるかをデバッグしたかっただけです

4

3 に答える 3

5

それを説明する最も正確なタイプはないと思います。もちろん、それは計算できないので、実際の型は になりますNothing

暗黙の canBuildFrom を忘れると、zip in の署名は次のようにList[A]なります。

def zip[B](l: List[B]) : List[(A,B)]

List[(Int, B)A = Int から始めると、 の引数がzipisであることを考慮しなくても、] があることは明らかですfs.tail。その知識を追加するとList[(Int, (Int, B))]、そこからループできるようになり、それを入力して、必要なList[(Int,(Int, (Int, _)))]数のレベルをネストできます。

その最も正確な型 (無限へのネスト) を scala で表現する方法はないと思います。とにかく、それは居住されておらず、この型には値が含まれておらず、 fs は計算できません。

于 2012-08-14T12:28:27.803 に答える
2

以下はコンパイルされますが、定義が再帰的な性質のため、アクセスすると がfs生成されます。StackOverflowError

lazy val fs:List[Product] = List(2,3,4).zip(fs.tail)

タイプについてより具体的にしたい場合は、次のようにすることができます。

lazy val fs:List[(Int, (Int, Product))] = List(2,3,4).zip(fs.tail)

タイプは ではありませんNothing。以下はコンパイルされないため:

scala> lazy val fs:Nothing = List(2,3,4).zip(fs.tail)
<console>:8: error: value tail is not a member of Nothing
   lazy val fs:Nothing = List(2,3,4).zip(fs.tail)

List[Nothing]fsをなどと定義すると、同様の型エラーが発生しますList[(Int, Nothing)]。したがって、明らかに式の型はListofProductです。代わりに使用するStreamと、実行時エラーを引き起こさないものを作成できます。

scala> lazy val fs:Stream[Any] = 0 #:: 1 #:: fs.zip(fs.tail).map(p => p:Any)
fs: Stream[Any] = <lazy>

scala> fs take 5 foreach println
0
1
(0,1)
(1,(0,1))
((0,1),(1,(0,1)))
于 2012-08-14T12:27:56.490 に答える
0

タイプセーフな方法でこれが可能だとは思いません。見てください:

scala> lazy val fs=List(1,2,3).zip(fs.tail)
<console>:7: error: recursive lazy value fs needs type
       lazy val fs=List(1,2,3).zip(fs.tail)
                                   ^

scala> lazy val fs:List[(Int,Int)]=List(1,2,3).zip(fs.tail)
<console>:7: error: type mismatch;
 found   : List[(Int, (Int, Int))]
 required: List[(Int, Int)]
       lazy val fs:List[(Int,Int)]=List(1,2,3).zip(fs.tail)

少なくとも、有用な結果を達成する方法がわかりません。あなたの意図は何ですか?

一方、これを行うことができます:

scala> val l = List(1,2,3)
l: List[Int] = List(1, 2, 3)

scala> val fs = l.zip(l.tail)
fs: List[(Int, Int)] = List((1,2), (2,3))

それはあなたの望む結果ですか?

于 2012-08-14T12:30:52.377 に答える