我有以下代码:
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。})。 但是,我的代码会在行
周围生成一些错误类型的错误{Set{sofar:+l2}}
和
x<-s1
有人知道如何解决这个问题吗?
答案 0 :(得分: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 强>
if (l1.equals (emtfoo)) // you should also check against ls.equals(emtfoo)
// as you're also dropping elements from l2
// in permutatefoo(l1,l2.drop(1),l2.take(1):::sofar))
第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)
}