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