Scala 用foldLeft实现“elem”

Scala 用foldLeft实现“elem”,scala,fold,Scala,Fold,我正在为你学习哈斯克尔。在“fold”部分,我需要实现elem(给定一个元素,找出它是否在列表中-True或False) 然而,它在一个简单的例子中失败了: scala> myElem('a', "ab".toList) a b res8: Boolean = false 我做错了什么?另外,作为额外的,我非常感谢任何关于改进此代码的建议 顺便说一句,我认为查找在这里更合适。这是一个非常简单的实现: def elem[A](a: A, as: List[A]): Boolean =

我正在为你学习哈斯克尔。在“fold”部分,我需要实现
elem
(给定一个元素,找出它是否在列表中-True或False)

然而,它在一个简单的例子中失败了:

scala> myElem('a', "ab".toList)
a
b
res8: Boolean = false
我做错了什么?另外,作为额外的,我非常感谢任何关于改进此代码的建议


顺便说一句,我认为
查找
在这里更合适。

这是一个非常简单的实现:

  def elem[A](a: A, as: List[A]): Boolean = as match {
    case Nil => false
    case h :: t => (h == a) || elem(a, t)
  }
此外,您可以使用
exists
,而不是
find

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)

是的,很干净,谢谢。但是使用
foldLeft
怎么样?@KevinMeredith我更新了答案,你可以使用foldLeft,但是如果你的列表很长,我就不会使用。看看我转换成Scala的LYAH版本:
def myElem[A](A:A,as:List[A]):Boolean={as.foldLeft(false){(acc,elem)=>if(elem==A)true-else-acc}
,我也喜欢你的版本,因为如果
累加器
(或者你称之为
bool
)是真的,它会短路。
  def elem[A](a: A, as: List[A]) = 
    as.foldLeft(false)((bool, value) => bool || value == a)