Streams 上 startsWith 的 Scala 实现
Scala implementation of startsWith on Streams
它应该检查一个 Stream (that) 是否是另一个 Stream (this) 的前缀。
例如,Stream(1,2,3) startsWith Stream(1,2) 为真。
这是我的实现,但总是 returns 错误!
谁能告诉我原因,也许还有 post 更正?
def startsWith[B >: A](that: Stream[B]): Boolean = (this, that) match {
case (_,Empty) => true
case (Cons(h,t),Cons(h2,t2)) if h == h2 => t().startsWith(t2())
case _ => false
}
def startsWith[B >: A](that: Stream[B]): Boolean = (this, that) match {
case (_,Empty) => true
case (Cons(h,t),Cons(h2,t2)) if h() == h2 => t().startsWith(t2())
case _ => false
stream1.zip(stream2).dropWhile { case (a,b) => a == b }.isEmpty
我不确定你的流是如何实现的,但如果一切都是懒惰的,我认为问题出在你的第二种情况:
case (Cons(h,t),Cons(h2,t2)) if h == h2 => t().startsWith(t2())
应该是
h() == h2()
否则你正在比较两个未计算的函数
它应该检查一个 Stream (that) 是否是另一个 Stream (this) 的前缀。
例如,Stream(1,2,3) startsWith Stream(1,2) 为真。
这是我的实现,但总是 returns 错误!
谁能告诉我原因,也许还有 post 更正?
def startsWith[B >: A](that: Stream[B]): Boolean = (this, that) match {
case (_,Empty) => true
case (Cons(h,t),Cons(h2,t2)) if h == h2 => t().startsWith(t2())
case _ => false
}
def startsWith[B >: A](that: Stream[B]): Boolean = (this, that) match {
case (_,Empty) => true
case (Cons(h,t),Cons(h2,t2)) if h() == h2 => t().startsWith(t2())
case _ => false
stream1.zip(stream2).dropWhile { case (a,b) => a == b }.isEmpty
我不确定你的流是如何实现的,但如果一切都是懒惰的,我认为问题出在你的第二种情况:
case (Cons(h,t),Cons(h2,t2)) if h == h2 => t().startsWith(t2())
应该是
h() == h2()
否则你正在比较两个未计算的函数