【问题标题】:Scala first program issueScala第一个程序问题
【发布时间】:2015-06-22 11:09:18
【问题描述】:

在一些其他语言的函数式编程经验之后,我刚刚开始学习 Scala。

def freq(c:Char, y:String, list:List[(Char,Int)]): List[(Char,Int)] = list match{
  case _ =>  freq(c, y.filter(_ == c), list :: List((count(c,y),c))) 
  case nil => list
} 

在上面的代码中,我在尝试递归连接列表时遇到错误。错误发生在list::List((count(c,y),c))。 count 方法接受一个 char 和一个字符串,并根据该 char 出现的次数返回一个 int。

任何帮助将不胜感激。我得到状态的错误发现 [(Char,Int)] 需要 (Char,Int)。

【问题讨论】:

    标签: scala recursion case frequency


    【解决方案1】:

    Cons 运算符 (::) 是一个中缀运算符,所以如果你想得到 List[T] 而不是 List[List[T]] 的类型,那么你应该写

    freq(c, y.filter(_ == c),(count(c,y),c)) :: list)
    

    【讨论】:

    • 找到 (Char,Int) 所需的 List[(Char,Int)]??
    • 在哪一行?顺便说一句:c 是 Char 类型,并且您正在创建的元组应该有 Int 类型的第二个元素 - 它仍然无法编译。
    • count的返回类型是Int,c是char。
    • 所以你应该写:freq(c, y.filter(_ == c),(c, count(c,y))) :: list)
    • 像这种情况 _ => freq(c, y.filter(_ == c),(c, count(c,y)) :: list) 它编译:P
    【解决方案2】:

    您还需要切换 2 个匹配情况,因为 nil 永远不会以这种方式进行评估。 _ 也将捕获 nil 并且永远不会继续到达第二种情况。

    【讨论】:

    • 谢谢,我会记住这一点,它与 Haskell 的工作方式有点不同,我可以只输入 [] = [] 或其他方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-03
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 2012-10-26
    相关资源
    最近更新 更多