我有问题。我通过其characterisitc函数表示一个集合,所以我为这个表示定义了一个类型别名。函数filterHead应该将set和谓词作为输入,并返回函数f的结果。
type Set = Int => Boolean
def filterHead(s: Set, f: Int => Boolean): Boolean = f(s.head)
然后发生以下错误:“值head不是Int => Boolean的成员”。并且错误与类型别名定义有关,而不是输入函数f
答案 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]
- 导入时为别名。