thi*_*bus 6 functional-programming scala
我正在学习Scala课程中的Coursera FP原则,而我在第2周的任务中遇到了最后一个功能.我不想要答案,而是帮助理解Scala功能组合.我认为我对如何解决问题有正确的想法,我只是在特定于Scala的部分被绊倒了.
要点是:我们已经获得了一个类型别名,定义如下:
type Set = Int => Boolean
Run Code Online (Sandbox Code Playgroud)
我将其解释为Set是一个函数,它接受一个Int并返回一个Bool.
我们还负责完成函数singletonSet,它接受一个int并返回一个Set.我是这样写的
def singletonSet(x: Int): Set = Set(x)
val three = singletonSet(3)
three(3) //True
three(5) //False
Run Code Online (Sandbox Code Playgroud)
我遇到问题的函数是Map函数,它具有以下签名:
def map(s: Set, p: Int => Int): Set
Run Code Online (Sandbox Code Playgroud)
我将其解释为一个带有集合的函数,用函数P转换其元素,并返回一个新的集合.
pesudocode:Map返回一个带有int的函数,如果该函数存在于Set中,则返回一个带有转换后的int X(或p(x)的新集合
破坏的实际代码:
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
Run Code Online (Sandbox Code Playgroud)
我没有意识到我的实施有什么问题.一位朋友在Haskell写了我的逻辑并发现它是成功的,所以我认为我的算法是正确的(虽然我可能是错的).我正在努力解决Scala实现细节问题.非常感谢任何建议或指导.
请记住,您在这里处理的是 a Set,并且被定义为将 an 转换为 a 的Set函数。因此,您的函数需要返回相同的内容:IntBoolean
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
}
Run Code Online (Sandbox Code Playgroud)
我们可以看到,尽管有输入,但有两种不同的输出情况,我们知道这一定是错误的。现在,让我们回想一下您还有其他功能,以及您对集合和“扩展”您正在构建的内容的定义:
def map(s: Set, p: Int => Int): (Int) => (Boolean) //Expand 'Set' to int->boolean
= (x: Int) => (Something that returns a boolean)
Run Code Online (Sandbox Code Playgroud)
您的工作是根据 的语义找出“某物”是什么map。我强烈建议您查看其他返回布尔值的函数,并询问它们如何在这里应用。具体来说,您正在寻找一个函数,对于提供的任何整数,如果该整数存在于原始集合中,则该函数将为您提供转换。