2013-06-12 85 views
0

我有以下代碼:斯卡拉置換列表(recusive類型不匹配)

 type foo= List[bar] 
     def emtfoo= List[bar]() 

    def permute(s1:Set[foo],s2:Set[foo]):Set[foo]={ 
    for{ 
     x<-s1 
     y<-s2 
    }yield permutatefoo(x,y,e,emtfoo) 



def permutatefoo(l1:foo,l2:foo,sofar:foo):Set[foo]={ 
    if (l1.equals (emtfoo)) { 
     Set{sofar:+l2} 
     } 
    else 
    { 
    combine(permutatefoo(l1.drop(1),l2,l1.take(1):::sofar), 
     permutatefoo(l1,l2.drop(1),l2.take(1):::sofar)) 
     } 
    } 
def combine(s1:Set[foo],s2:Set[foo]):Set[foo] = 
    for{ 
     x <- s1 
     y<- s2 
    } yield x ::: y 

這應該是相當簡單的代碼到重排列2套列表爲一組同時具有列出的所有可能的permamutations在沒有元素出現在元素前面的順序不在列表本身的前面(所以如果我們有列表a = 1,2,3和列表b = a,b,c,那麼它應該返回Set { 1,a,2,b,3,c-1,2,a,3,b,ca,1,2,3,b,c ext。})。 但是我的代碼生成周圍行了一些錯誤類型mistmaches

{Set{sofar:+l2}} 

x<-s1 

沒有任何人知道如何解決這一問題?

+1

爲了記錄這個詞是「置換」,而不是「置換」。 –

回答

1

我不知道我神交所有的代碼,也有一些是我看到的是:

1:

{Set{sofar:+l2}} // should probably be Set(sofar ++ l2) 
       // as it seems you just want to concatenate sofar and l2 
       // which are both List[bar] (so your return value is a Set[foo] 
       // i.e. a Set[List[bar]] as the signature for 
       // permutatefoo requests 

:+是提取器(see the doc)和它的不應該

:以這種方式

2中可使用

3:

的返回類型permute是錯誤的。您定義它的方式將返回Set[Set[foo]]而不是Set[foo]。我不確定我是否理解你想要它做什麼,但是如果你修復了返回類型,至少應該進行類型檢查。


這是您編譯的代碼的一個版本。我不是說工程(正如我所說的,我不確定我是否理解你的程序的所有預期輸入和輸出應該是什麼),但它編譯。

type bar=Int 

type foo= List[bar] 
def emtfoo= List[bar]() 

def combine(s1:Set[foo],s2:Set[foo]) = 
    for{ 
     x <- s1 
     y <- s2 
    } yield x ++ y 

def permutatefoo(l1:foo, l2:foo, sofar:foo): Set[foo]={ 
    if (l1.equals (emtfoo) || l2.equals (emtfoo)) { 
     Set(sofar ++ l2) 
     } 
    else 
    { 
    combine(permutatefoo(l1.drop(1),l2,l1.take(1) ++ sofar), 
     permutatefoo(l1,l2.drop(1),l2.take(1) ++ sofar)) 
    } 
} 

def permute(s1:Set[foo],s2:Set[foo]) : Set[Set[foo]] = { 
    for { 
     x <- s1 
     y <- s2 
    } yield permutatefoo(x,y,emtfoo) 
}