我在Scala课程中学习了Coursera FP原则,并且我在第2周的任务中遇到了最后一个功能的问题。我不想要答案,而是帮助理解Scala功能组合。我认为我对如何解决问题有正确的想法,我只是在特定于Scala的部分被绊倒。
要点是:我们已经获得了一个类型别名,定义如下:
type Set = Int => Boolean
我将其解释为Set是一个函数,它接受一个Int并返回一个Bool。
我们还负责完成函数singletonSet,它接受一个int并返回一个Set。我已经这样写了
def singletonSet(x: Int): Set = Set(x)
val three = singletonSet(3)
three(3) //True
three(5) //False
我遇到问题的功能是Map功能,它有这个签名:
def map(s: Set, p: Int => Int): Set
我将其解释为一个带有集合的函数,用函数P转换其元素,并返回一个新的集合。
pesudocode:Map返回一个带有int的函数,如果Set中存在这个int,则返回一个带有转换后的int X(或p(x)
的新Set实际破解的代码:
def map(s: Set, p: Int => Int): Set = {
x =>
if (s(x)) singletonSet(p(x))
else p(x) => false
}
The error that I'm getting with this format is:
error: not a legal formal parameter.
Note: Tuples cannot be directly destructured in method or function parameters.
Either create a single parameter accepting the Tuple1,
or consider a pattern matching anonymous function: `{ case (param1, param1) => ... }
else p(x) => false
我没有意识到我的实施有什么问题。一位朋友在Haskell写了我的逻辑并发现它是成功的,所以我认为我的算法是正确的(虽然我可能是错的)。我正在努力解决Scala实施细节问题。非常感谢任何建议或指导。
答案 0 :(得分:1)
请记住,您在此处理Set
,Set
被定义为将Int
转换为Boolean
的函数。因此,您的函数需要返回相同的内容:
def map(s: Set, p: Int => Int): Set = {
x =>
if (s(x)) singletonSet(p(x)) // Returns a Set
else p(x) => false // Returns a Boolean
}
我们可以看到,尽管有输入,但你有两种不同的输出情况,我们知道它们一定是错的。现在,让我们回想一下,您还有其他功能,以及您对set的定义以及' expand'你正在建设什么:
def map(s: Set, p: Int => Int): (Int) => (Boolean) //Expand 'Set' to int->boolean
= (x: Int) => (Something that returns a boolean)
你的工作就是找出那些东西'是,基于map
的语义。我强烈建议您查看返回布尔值的其他函数,并询问它们如何应用于此处。具体来说,您正在寻找一个函数,对于任何提供的整数,如果该整数存在于原始集合中,它将为您提供转换。