由Int提供的Scala和Set参数化类型

时间:2014-12-13 18:54:20

标签: scala scala-collections

我正在研究一个带有元素的函数,并返回带有这个元素的单例类,如下所示:

def singletonSet(elem: Int): Set =
  e => elem == e

但是scala REPL表明了这样的问题:

scala>   def singletonSet(elem: Int): Set =
     |     e => elem == e
<console>:7: error: type Set takes type parameters
         def singletonSet(elem: Int): Set =

我尝试将Set的类型添加为Int,但它没有帮助

def singletonSet(elem: Int): Set[Int] =
  e => elem == e

scala>   def singletonSet(elem: Int): Set[Int] =
     |     e => elem == e
<console>:8: error: type mismatch;
 found   : Int => Boolean
 required: Set[Int]
           e => elem == e

坦率地说,我不知道我的错误在哪里,我使用2.11.4 scala:)

编辑:

我对这行代码有类似的问题:

def union(s: Set[Int], t: Set[Int]): Set[Int] = (e: Int) => s(e) || t(e)
<console>:7: error: type mismatch;
 found   : Int => Boolean
 required: Set[Int]
       def union(s: Set[Int], t: Set[Int]): Set[Int] = (e: Int) => s(e) || t(e)

这会导致类似的错误。

编辑:

我忘记了

type Set = Int => Boolean

3 个答案:

答案 0 :(得分:1)

试试这个:

def singletonSet(elem: Int): Set[Int] = Set(elem)

这样您就可以调用Set.apply方法创建Set,其中包含e的单个元素。

你的直觉是Int=>BooleanSet[Int]的另一种方式。

答案 1 :(得分:1)

您需要提供一个类型参数以使其成为通用

def singletonSet[A](a: => A): Set[A] = Set(a)

=>避免在将参数元素放入Set之前对其进行评估。


顺便提一下,您尝试实施的内容正是point类型类的Applicative方法。

Here's它的scalaz版本。

使用scalaz,您可以执行类似

的操作
1.point[Option] // Some(1)
1.point[Set]    // Set(1) -- this requires scalaz-outlaws
1.point[List]   // List(1)

请注意,由于Set不被认为是正确的Applicative(也不是Functor),因此Applicative实例的实现由{{{1}}提供。 3}}项目。

答案 2 :(得分:0)

以下是比较 - 因此返回类型是布尔值

elem == e

你想要什么:

Set(elem)

所以:

scala> def singletonSet(elem: Int): Set[Int] = Set(elem)
singletonSet: (elem: Int)Set[Int]