0

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

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

然后出现以下错误:“值头不是 Int => Boolean 的成员”。和类型别名定义有关的错误,而不是输入函数 f

4

1 回答 1

1

当您为 定义别名时SetSet参数将“展开”为完整类型:

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]以不同的名称导入 - 导入时的别名。

于 2013-10-30T08:35:57.767 回答