如何对列表中的元素使用模式匹配?
How do I use pattern matching for elements within a list?
我正在应对 Advent of Code 的编码挑战,现在是第一天。我从一个只包含 ((()(())(( 所以我希望将每个 '(' 变为 1 并将每个 ')' 变为 -1 的文件中读取,以便我可以计算它们。但是我在 map findFloor over source 时遇到问题。我遇到了类型不匹配的问题。一切对我来说都是正确的,这就是奇怪的部分因为它不起作用。
import scala.io._
object Advent1 extends App {
// Read from file
val source = Source.fromFile("floor1-Input.txt").toList
// Replace each '(' with 1 and each ')' with -1, return List[Int]
def findFloor(input: List[Char]):Int = input match {
case _ if input.contains('(') => 1
case _ if input.contains(')') => -1
}
val floor = source.map(findFloor)
}
错误输出
error: type mismatch;
found : List[Char] => Int
required: Char => ?
val floor = source.map(findFloor)
^ one error found
我做错了什么? / 我错过了什么?
Scala map
工作 over an elements 而不是整个集合。试试这个:
val floor = source.map {
case '(' => 1
case ')' => -1
}.sum
如果你想按顺序计算它们,你甚至可以直接使用 foldLeft 进行计算。
val computation = source.foldLeft(0)( (a, b) => {
b match {
case '(' => a + 1
case ')' => a - 1
}
})
它只是将所有值相加并返回累加值。对于 ( 它是加法,对于 ')' 它是减法。
第一个参数是起始值,a 是上一步的值,b 是实际元素,因此是 char。
您的错误可能是因为没有为所有字符定义模式匹配。你错过了所有其他人的比赛,例如 case _ => 0 。
另一种选择是使用 'collect',因为它接受 PartialFunction 并忽略所有不匹配的元素。
我认为建议的 'fold' 解决方案是更好的方法。
我正在应对 Advent of Code 的编码挑战,现在是第一天。我从一个只包含 ((()(())(( 所以我希望将每个 '(' 变为 1 并将每个 ')' 变为 -1 的文件中读取,以便我可以计算它们。但是我在 map findFloor over source 时遇到问题。我遇到了类型不匹配的问题。一切对我来说都是正确的,这就是奇怪的部分因为它不起作用。
import scala.io._
object Advent1 extends App {
// Read from file
val source = Source.fromFile("floor1-Input.txt").toList
// Replace each '(' with 1 and each ')' with -1, return List[Int]
def findFloor(input: List[Char]):Int = input match {
case _ if input.contains('(') => 1
case _ if input.contains(')') => -1
}
val floor = source.map(findFloor)
}
错误输出
error: type mismatch;
found : List[Char] => Int
required: Char => ?
val floor = source.map(findFloor) ^ one error found
我做错了什么? / 我错过了什么?
Scala map
工作 over an elements 而不是整个集合。试试这个:
val floor = source.map {
case '(' => 1
case ')' => -1
}.sum
如果你想按顺序计算它们,你甚至可以直接使用 foldLeft 进行计算。
val computation = source.foldLeft(0)( (a, b) => {
b match {
case '(' => a + 1
case ')' => a - 1
}
})
它只是将所有值相加并返回累加值。对于 ( 它是加法,对于 ')' 它是减法。
第一个参数是起始值,a 是上一步的值,b 是实际元素,因此是 char。
您的错误可能是因为没有为所有字符定义模式匹配。你错过了所有其他人的比赛,例如 case _ => 0 。 另一种选择是使用 'collect',因为它接受 PartialFunction 并忽略所有不匹配的元素。
我认为建议的 'fold' 解决方案是更好的方法。