Scala 用foldLeft实现“elem”
我正在为你学习哈斯克尔。在“fold”部分,我需要实现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 =
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)