2015-03-05 4 views
0

Я пишу функцию, которая удаляет ий элемент из списка (это происходит от Скалх 99 проблем) и был озадачена специфическим поведением это рекурсивная функция работает отличноScala: функция с внутренней рекурсивной функцией

def removeAt3(startPos:Int, inputList :List[Symbol]) = { 
    // will use inner recursive function 
    def removeAtRecursive(position:Int, lst:List[Symbol]):List[Symbol] = (position, lst) match { 
    case (_, Nil) => println("end of list");List[Symbol]() 
    case (any, h::tl) => if (any == startPos) removeAtRecursive(any + 1, tl) else h::removeAtRecursive(any+1, tl) 
    } 
    removeAtRecursive(0, inputList) 
} 

Но этой версии нет.

def removeAt4(startPos:Int, inputList :List[Symbol]) = { 
    // will use inner recursive function 
    def removeAtRecursive(position:Int, lst:List[Symbol]):List[Symbol] = (position, lst) match { 
    case (_, Nil) => println("end of list");List[Symbol]() 
    case (startPos, h::tl) => removeAtRecursive(position + 1, tl) 
    case (any, h::tl) => h::removeAtRecursive(any+1, tl) 

    } 
    removeAtRecursive(0, inputList) 
} 
removeAt4(3, List('a, 'b, 'c, 'd, 'e, 'f)) 

В самом деле Eclipse, продолжает жаловаться, что case(any, h::tl) недостижим.

Но если я позвоню removeAt4(3, List('a, 'b, 'c, 'd, 'e, 'f)) не должен case(startPos, h::tl) быть переведен в: case(3, h::tl)?

ответ

0

В вашем втором примере case (startPos, h::tl) не делает то, что вы думаете. Он определяет кортеж, в котором новая переменная startPos привязана к первому элементу кортежа. По сути, он идентичен вашему окончательному случаю case (any, h::tl), поэтому последний случай недостижим.

Кстати, this question есть ответ, который вы можете адаптировать:

def removeAt(startPos:Int, inputList:List[Symbol]) = { 
    list.zipWithIndex.collect { 
     case (x,i) if i != startPos == 0 => x 
    } 
} 
+0

спасибо большое плинтуса! – user1068378

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