斯卡拉。设置为函数

时间:2013-10-30 08:11:17

标签: scala set

我有问题。我通过其characterisitc函数表示一个集合,所以我为这个表示定义了一个类型别名。函数filterHead应该将set和谓词作为输入,并返回函数f的结果。

 type Set = Int => Boolean
 def filterHead(s: Set, f: Int => Boolean): Boolean = f(s.head)

然后发生以下错误:“值head不是Int => Boolean的成员”。并且错误与类型别名定义有关,而不是输入函数f

1 个答案:

答案 0 :(得分:1)

Set定义别名时,Set参数将“展开”为完整类型:

scala> type Set = Int => Boolean
defined type alias Set

scala> def foo(s : Set, i : Int) = ???
foo: (s: Int => Boolean, i: Int)Nothing

当您使用Set(1,2,3)时,您正在使用伴随对象的apply方法,该方法返回不同的类型:

scala> val set = Set(4,1,2)
set: scala.collection.immutable.Set[Int] = Set(4, 1, 2)

另外,您可能会注意到,集合集在这里是通用的。你也可以创建一个泛型类型别名(别名是Set[T]),所以仍然会有一些混乱。

解决方案?使用完整类型名称:

scala> def filterHead(s : scala.collection.immutable.Set[Int], setFunc : Set) = setFunc(s.head)
filterHead: (s: scala.collection.immutable.Set[Int], setFunc: Int => Boolean)Boolean

或者为别名命名:

type SetFunc = Int => Boolean

或以通用方式:

type SetFunc[T] = T => Boolean

甚至可以使用其他名称导入scala.collection.immutable.Set[T] - 导入时为别名。