我正在研究一个带有元素的函数,并返回带有这个元素的单例类,如下所示:
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
答案 0 :(得分:1)
试试这个:
def singletonSet(elem: Int): Set[Int] = Set(elem)
这样您就可以调用Set.apply
方法创建Set
,其中包含e
的单个元素。
你的直觉是Int=>Boolean
和Set[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]