scala - pattern match component 'x' is constrained to be isInstanceOf[List[Any]] - but can't treat 'x' as that type on RHS -
to familiar scala lists decided implement flatten, take list like: list(list(2,4), 22, list(1)) list(2, 4, 22, 1).
when attempted run code below
def flatify(xs: list[any]) : list[any] = { xs match { case nil=> { nil } case x::rest if x.isinstanceof[list[any]] => { flatify(x):: flatify(rest) // bad line } case x::rest => { x:: flatify(rest) } case _ => { throw new illegalstateexception("cant match") } } } var list = list(list(4, 5), 9, 10, list(1, 2)) flatify(list) the compiler complained line commented '// bad line', saying:
error:(84, 17) type mismatch; found : required: list[any] flatify(x):: flatify(rest) ^ this strikes me odd, since guard condition explicitly requires x isinstanceof[list[any]]. understand any superclass of list[any] have thought once compiler gets right hand side of expression
flatify(x) :: flatify(rest) it accept x list[any].
i'm sure implementation might have other problems have not debugged yet, before moved on wanted try understand scala compiler here. tips or pointers gratefully appreciated.
you're matching on list[any], when have
case x :: tail if(x.isinstanceof[list[any]]) => x ... ^ ^ ^ true, type of still x determined x any , tail list[any]. if condition nothing change type of x, if can test x.isinstanceof[list[any]], x still any. need match on type, itself.
def flatify(xs: list[any]) : list[any] = { xs match { case nil => nil case (x: list[any]) :: rest => flatify(x) ::: flatify(rest) case x :: rest => x :: flatify(rest) case _ => throw new illegalstateexception("cant match") } } furthermore, there bug. given x correctly matched list[any], following flatify(x) :: flatify(rest) place list[any] @ head of list[any], , therefore no flattening @ all. changed :::.
scala> flatify(list(1,2,3,list(4,5,6), list(7,8,9))) res1: list[any] = list(1, 2, 3, 4, 5, 6, 7, 8, 9)