2015-10-22 9 views
1

Только что началось с Scala. Каждый раз, когда я пытаюсь выполнить его, отображается ошибка несоответствия. Я возвращаю целое число. Тем не менее, компилятор находит тип Unit от бога знает где.scala: несоответствие типа (найдено единицы, вам нужно int)

object a { 
    def search(e : Int,arr : Array[Int]): Int = { 
    var l: Int = 0 
    for(l <- 0 arr.length) { 
     if(arr(l) == e) { 
     return e 
     } else { 
     return -1 
     } 
    } 
    } 

    def main(args: Array[String]) { 
    var i = 0 
    println("enter the number of elements ") 
    var n = readLine.toInt 

    println("enter the elements are") 
    var arr = new Array[Int](n) 
    for(i <- 0 to n-1) { 
     println("enter element "+i+" ") 
     arr(i) = readLine.toInt 
    } 
    for(i <- 0 to n-1) { 
     println("element "+i+" is "+arr(i)) 
    } 

    println("sorted array is") 
    arr = arr.sortWith(_ < _) 
    for(i <- 0 to n-1) { 
     println(arr(i)) 
    } 

    println("enter the number to be searched ") 
    var e = readLine.toInt 
    var result: Int = search(e,arr) 
    if(result == e) { 
     println("element found") 
    } else { 
     println("element not found") 
    } 
    } 
} 

выход

[email protected]:~$ scalac a.scala 
a.scala:6: error: type mismatch; 
found : Unit 
required: Int 
     for(l<-0 until arr.length) 
       ^
one error found 
+1

Более идеоматичным способом написать это в Scala может быть http://pastebin.com/UrTSsDt1 –

ответ

0

Более наглядные подходы к search, как изначально было определено выше, что обеспечивает функциональную неизменность и идиоматические элементы Scala. включение Примечания массива передает намеченную семантику,

def search(e : Int, arr : Array[Int]): Int = if (arr contains e) e else -1 

Используя для понимания мы уступаем нашли элементы и тест непосещения пустоты в полученном списке

def search(e : Int, arr : Array[Int]): Int = { 
    val res = for (a <- arr if a == e) yield a 
    if (res.nonEmpty) res.head else -1 
} 

Применимого здесь является то, что мы итерация по каждому элементу arr без необходимости индексирования. Также рассмотрим exists, который остановится на первом матче встречаются,

def search(e : Int, arr : Array[Int]): Int = if (arr.exists(_ == e)) e else -1 

Использование find доставляем найденное значение или еще -1,

def search(e : Int, arr : Array[Int]): Int = arr.find(_ == e).getOrElse(-1) 

Обратите внимание, что find возвращает Option, либо Some(value) или None, если не было ни одного найденный; с getOrElse мы обрабатываем не найденный случай.

2

Основной причиной ошибки в for, вы забыли yield.

В более широком масштабе вы запускаете классическую проблему перехода с Java на Scala. Вы не можете разбить цикл for. (В действительности вы можете, но только взломанным способом: How to yield a single element from for loop in scala?).

Возможный подход здесь, чтобы использовать большую коллекцию библиотеки Scala whcih Allready содержит функцию, реализованную: indexOf:

def search(e : Int,arr : Array[Int]) : Int = arr.indexOf(e) 

даст ожидаемый результат.

Смежные вопросы