用foldLeft实现`elem`

时间:2014-04-18 03:10:59

标签: scala fold

我正在努力学习你是一个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在这里会更合适。

1 个答案:

答案 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)