scala - Scala 中的类型不匹配(过滤函数)

标签 scala

我是 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,这不是过滤器方法通常所做的事情。 AB 是两个不相关的类型,因此不能在它们之间进行转换

你会想要这样的东西:

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/

相关文章:

scala - 在 Slurm 上运行 Spark

scala - 如何将选项添加到列表

scala - 在所有测试之前运行测试设置

android - 使用带有 Ant 的 AndroidProguardScala 构建 Android 项目

scala - 实现在 scala 中执行柯里化(Currying)的高阶函数

scala - 为什么会发生这种隐含的歧义行为?

java - 使用单线程 ForkJoinPool 在 Future 内运行 Future.map

scala - 理解产品和副产品的图表

scala - 根据spark中前一行同一列的值计算值

scala - 为什么 Int 不从 Ordered[Int] 继承/扩展