我是 Scala 新手,尝试专注于更多函数式编程 一边。
我正在尝试编写一个函数过滤器。
这里是定义和实现:
def filter[A, B](f: A => Boolean, l: List[A]): List[B] = l match {
case Nil => List()
case x :: xs => if (f(x)) (x: B) :: filter(f, xs) else filter(f, xs)
}
使用此函数时,出现以下错误: :32: 错误:类型不匹配;
found : x.type (with underlying type A)
required: B
case x :: xs => if (f(x)) (x: B) :: filter(f, xs) else filter(f, xs)
现在,在此之前我写了一个函数映射:
def map[A, B](f: A => B, l: List[A]): List[B] = l match {
case Nil => List()
case x :: xs => f(x) :: map(f, xs)
}
实际上应用函数 f 将每个列表元素从类型 A 转换为类型 B。
我的过滤器错误似乎是由过滤器采用的函数引起的 对列表类型 A 的元素 x 不执行任何操作,因此类型检查器认为当需要 B 时我仍在构建类型 A 的列表。你可以看到我尝试将 x 指定为 B 类型,但没有成功。谁能确认我正确理解了问题以及如何使 x 成为 B 型?我可以只返回 A 类型的列表,但是 这是作为练习给出的函数定义,我无法更改它。
最佳答案
您的过滤器方法似乎尝试将 A
转换为 B
,这不是过滤器方法通常所做的事情。 A
和 B
是两个不相关的类型,因此不能在它们之间进行转换
你会想要这样的东西:
def filter[A](l: List[A])(f: A => Boolean): List[A] = l match {
case Nil => List()
case x :: xs => if (f(x)) x :: filter(xs)(f) else filter(xs)(f)
}
但是你也可以把这个写得更简单一点:
def filter[A](l: List[A])(f: A => Boolean): List[A] =
for (x <- l if f(x)) yield x
另请注意,我已经交换了参数并将它们分开。这样做是为了让 scala 的类型推断能够自动推断 A
。现在你可以这样做:
filter(List(1, 3, 5, 7))(_ > 4)
其中 Int
类型是隐式推断的
关于scala - Scala 中的类型不匹配(过滤函数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32811271/