如何有意义地在类型中定义的scala中使用函数类型?

Cla*_*Bao 10 scala

我很新,对scala很天真.只知道如何定义一个函数类型,例如Set here(仅作为示例).

type Set = Int => Boolean 

def set(i: Int): Set = n => n == i 
def contains(s: Set, i: Int) = s(i)
Run Code Online (Sandbox Code Playgroud)

我还阅读了与语言无关的函数类型的维基.看来C#,C,Haskel也有类似的语法. http://en.wikipedia.org/wiki/Function_type.

我的问题是在哪种情况下你更喜欢定义这种抽象类型函数之一并使用它,而没有其他选择来达到同一目标?比较直接定义使用的具体方法def

或者我可以放弃要求,说使用这个函数类型,我可以使代码看起来更好.这样我就可以更多地了解函数类型.

在这里我主要感兴趣的部分是type Set = Int => Boolean,当你想抽象出来的时候?我正在寻找现实生活中的用例,以及如何在scala语法中的具体方法中实现它.例如,这个有点复杂.

type Set2 = (Int,Int,String) => (Boolean  => Int) => (Boolean  => Int).
Run Code Online (Sandbox Code Playgroud)

我知道它被称为更高级的类型.语法本身确实很有意义. 但我只需要scala初学者更简单的现实生活例子.

我发现这个答案描述了它. 什么是Scala中更高级的kinded类型?

但它对我来说仍然有点模糊.我更喜欢初学者的简单答案. 似乎函数本身除了参数和结果类型之外不需要任何实现方法. 例如,如果结果(布尔值)不是来自参数(Int),它仍然会编译.

def set(i: Int): Set1 = aa => new Date().getDate() == i 
Run Code Online (Sandbox Code Playgroud)

我不是吗?

让我知道为什么这个问题不明确或不好,所以我可以改进它,先生!

agi*_*eel 29

typeScala中的关键字为给定类型创建别名.例如:

scala> type Str = String
defined type alias Str

scala> val greeting: Str = "Hello World!"
greeting: Str = Hello World!
Run Code Online (Sandbox Code Playgroud)

这与你的做法非常相似:

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

scala> val isEven: Set = _ % 2 == 0
isEven: Int => Boolean = <function1>

scala> println(isEven(4))
true

scala> println(isEven(5))
false
Run Code Online (Sandbox Code Playgroud)

虽然类型别名有时可用于澄清目的,但文档不是它们的主要用例.Scala的类型系统非常复杂.例如,有一种替代泛型,即抽象类型.考虑一下:

// Generics
abstract class GenericAbstraction[TypeArgument]
class GenericConcrete extends GenericAbstraction[String]

// Abstract types
abstract class TypeAbstraction {
   type TypeArgument
}
class TypeConcrete extends TypeAbstraction {
   type TypeArgument = String
}
Run Code Online (Sandbox Code Playgroud)

这些代码示例基本上完成了同样的事情,但是在某些情况下您需要抽象类型,但不能(或不应该)使用泛型.您可以在此处找到更多信息.