Scala Else返回函数

时间:2016-08-25 20:07:11

标签: scala functional-programming

我在Scala课程中学习了Coursera FP原则,并且我在第2周的任务中遇到了最后一个功能的问题。我不想要答案,而是帮助理解Scala功能组合。我认为我对如何解决问题有正确的想法,我只是在特定于Scala的部分被绊倒。

要点是:我们已经获得了一个类型别名,定义如下:

type Set = Int => Boolean

我将其解释为Set是一个函数,它接受一个I​​nt并返回一个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实施细节问题。非常感谢任何建议或指导。

1 个答案:

答案 0 :(得分:1)

请记住,您在此处理SetSet被定义为将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的语义。我强烈建议您查看返回布尔值的其他函数,并询问它们如何应用于此处。具体来说,您正在寻找一个函数,对于任何提供的整数,如果该整数存在于原始集合中,它将为您提供转换。