0

我在 scala 中编写了一个包含许多函数的代码,但是当我运行代码时,在一个函数中我得到 3 个错误:

1)type Integral 采用类型参数 def date(start_date:String,end_date:String,duration:Integral,final_list:List[List[List[String]]]):List[List[List[List[String]]]]=

2)type List 采用类型参数 failed_list_with_date::=ListList[List]

3)type List 采用类型参数 failed_list_with_date::=ListList[List]

这是代码的相关摘录

def **joda_to_string(time:org.joda.time.DateTime):String**=
{
  val datestring= time.getYearOfEra.toString+"-"+time.getMonthOfYear.toString+"-"+  time.getDayOfMonth.toString
  return datestring
}

def date(start_date:String,end_date:String,**duration:Integral**,final_list:List[List[List[String]]  ]):List[List[List[List[String]]]]=
{

var failed_list_with_date=List[List[List[List[String]]]]()
var start_list=(start_date.split("-"))
var end_list=end_date.split("-")
val start_date_strip=new DateTime((start_list(0).toInt), start_list(1).toInt,   start_list(2).toInt,0,0,0,0)
val end_date_strip=new DateTime((end_list(0).toInt), end_list(1).toInt,   end_list(2).toInt,0,0,0,0)
var diff=((end_date_strip.getMillis-start_date_strip.getMillis)/3600/1000/24)
  **var a = start_date_strip
var b =a.plusDays(duration).minusDays(1)**
if (failed_list==List[List[List[String]]]()){}
  else
  {
    **failed_list_with_date::=List[List[List]](joda_to_string(b))
    failed_list_with_date::=List[List[List]](joda_to_string(a))**

我知道这看起来令人困惑我试图发布代码的必要部分并将重要的东西放在**之间

4

1 回答 1

2

哇,这是一个令人困惑的问题。

让我们从一些重新格式化开始。也是一种风格说明,在 Scala 中,您通常不需要使用return关键字。任何代码块都将返回其最后一个表达式的值。此外,Scala 将在使用以下方法构建结果字符串时自动调用toString非字符串对象+

def joda_to_string( time: org.joda.time.DateTime ): String = {
  time.getYearOfEra.toString + "-" + time.getMonthOfYear +
    "-" + time.getDayOfMonth
}

def date( start_date: String, end_date: String, duration: Int,
          final_list: List[List[List[String]]] ): List[List[List[List[String]]]] = {

    var failed_list_with_date = List[List[List[List[String]]]]()
    var start_list = (start_date.split("-"))
    var end_list = end_date.split("-")
    val start_date_strip = new DateTime((start_list(0).toInt), start_list(1).toInt,   start_list(2).toInt,0,0,0,0)
    val end_date_strip = new DateTime((end_list(0).toInt), end_list(1).toInt,   end_list(2).toInt,0,0,0,0)
    var diff=((end_date_strip.getMillis-start_date_strip.getMillis)/3600/1000/24)
      var a = start_date_strip
    var b = a.plusDays(duration).minusDays(1)
    if (failed_list == List[List[List[String]]]()) {}
      else {
    failed_list_with_date ::= List(List(List(joda_to_string(b))))
    failed_list_with_date ::= List(List(List(joda_to_string(a))))
    }
  }

如果您知道类型参数是什么,则错误实际上非常简单。第一个是type Integral takes type parameters。这是因为您使用了错误的类型。您可能的意思Int是 Scala 的Integer.

另外两个提醒你List takes a type parameter。你有一个嵌套类型:List[List[List]] 这里的内部类型是 a Listand ...它需要一个类型参数。也许你的意思是List[List[List[String]]]?实际上,您需要在这里构造一个适当类型的列表,这就是:List(List(List(joda_to_string(b))))所做的。

但我真的不知道,因为这是我见过的最奇怪的屁股类型。

没有试图弄清楚你的代码试图做什么(因为它让我头疼),我的猜测是你真的应该使用一个普通的List[String]并且你应该每次都将新元素添加到列表的前面:

failed_list_with_date ::= joda_to_string(b)
于 2013-09-30T13:43:04.030 回答