Получение ошибки несоответствия типов в функции в качестве параметра в scala - PullRequest
0 голосов
/ 13 февраля 2020

Я сталкиваюсь с некоторыми проблемами несоответствия типов в scala, когда я вызываю метод in_shuffle из n_shuffle, передавая функцию в качестве параметра.

  def in_shuffle[T](original: List[T], restrict_till:Int= -1):List[T]={

    require(original.size % 2 == 0, "In shuffle requires even number of elements")
    def shuffle(t: (List[T], List[T])): List[T] =
      t._2 zip t._1 flatMap { case (a, b) => List(a, b) }

    def midpoint(l: List[T]): Int = l.size / 2

    @annotation.tailrec
    def loop(current: List[T], restrict_till:Int, count:Int=0): List[T] = {
      if (original == current || restrict_till == count) current
      else{
        val mid         = midpoint(current)
        val shuffled_ls = shuffle(current.splitAt(mid))
        loop(shuffled_ls, restrict_till, count+1)
      }
    }
    loop(shuffle(original.splitAt(midpoint(original))), restrict_till, 1)
  }

def n_shuffle[T](f: (List[T], Int) => List[T], list:List[T], n:Int):List[T]={
  println("Inside Sub-function")
  f(list, n)
}

Здесь как я звоню n_shuffle в main

print( n_shuffle(in_shuffle, (1 to 8).toList, 2) )

Я получаю ошибку

Error:(161, 22) type mismatch;
 found   : (List[Nothing], Int) => List[Nothing]
 required: (List[Int], Int) => List[Int]
    print( n_shuffle(in_shuffle, (1 to 8).toList, 2) )

Любая помощь будет высоко оценена. Спасибо

Ответы [ 2 ]

2 голосов
/ 13 февраля 2020

Попробуйте несколько списков параметров, чтобы помочь выводу типа

def n_shuffle[T](list: List[T], n: Int)(f: (List[T], Int) => List[T]): List[T]
n_shuffle((1 to 8).toList, 2)(in_shuffle)

или предоставить явную аннотацию типа

n_shuffle(in_shuffle[Int], (1 to 8).toList, 2)
n_shuffle[Int](in_shuffle, (1 to 8).toList, 2)

Компилятор причины не может определить тип первого параметра в

def n_shuffle[T](f: (List[T], Int) => List[T], list: List[T], n: Int)

потому что он получил бы его от (1 to 8).toList, однако это второй аргумент.

0 голосов
/ 13 февраля 2020

Кажется, что вывод в этом случае не работает, как ожидалось. Принуждение типа в методе in_shuffle [Int] добилось цели.

Попробуйте вместо этого.

print(n_shuffle(in_shuffle[Int], (1 to 8).toList, 2))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...