微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

type Set = Int => Boolean 

def set(i: Int): Set = n => n == i 
def contains(s: Set,i: Int) = s(i)

我也阅读了语言无关功能类型的维基.似乎C#,C,Haskel也有类似的语法.
http://en.wikipedia.org/wiki/Function_type.

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

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

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

type Set2 = (Int,Int,String) => (Boolean  => Int) => (Boolean  => Int).

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

我发现这个答案为它描述.
What is a higher kinded type in Scala?

但是,对我看来还是有点模糊.我喜欢初学者简单的答案.
似乎函数本身不需要任何除了实现mentod的参数和结果类型之外的任何东西.
例如,如果结果(Boolean)不是来自参数(Int),它仍然编译.

def set(i: Int): Set1 = aa => new Date().getDate() == i

我是对的吗

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

解决方法

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

scala> type Str = String
defined type alias Str

scala> val greeting: Str = "Hello World!"
greeting: Str = Hello World!

这与你做的非常相似:

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

虽然类型别名有时可用于澄清目的,文档不是其主要用例. 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
}

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐