我正在努力学习你是一个Haskell。在"折叠"部分,我需要实现elem
(给定一个元素,找出它是否在列表中 - 是真还是假)。
def myElem(a: Char, as: List[Char]): Boolean = as match {
case Nil => false
case x::Nil => println(x); if(x == a) true else false
case x::_ => println(x); as.foldLeft(false){ (_, elem) =>
if(a == elem) true
else myElem(a, as.tail)
}
}
然而,它失败了一个简单的例子:
scala> myElem('a', "ab".toList)
a
b
res8: Boolean = false
我在这里做错了什么?此外,作为额外的,我很欣赏有关改进此代码的任何建议。
顺便说一句,我认为find
在这里会更合适。
答案 0 :(得分:2)
这是一个非常简单的实现:
def elem[A](a: A, as: List[A]): Boolean = as match {
case Nil => false
case h :: t => (h == a) || elem(a, t)
}
此外,您可以使用find
代替exists
:
def elem[A](a: A, as: List[A]) = as.exists(_ == a)
如果你想foldLeft
,你仍然可以遍历整个清单,而不是提早停止:
def elem[A](a: A, as: List[A]) =
as.foldLeft(false)((bool, value) => bool || value == a)