Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Scala中键入别名_Scala - Fatal编程技术网

在Scala中键入别名

在Scala中键入别名,scala,Scala,阅读时,我看到以下类型别名: type Const[M, B] = M implicit def monoidApplicative[M](M: Monoid[M]) = new Applicative[({ type f[x] = Const[M, x] })#f] { def unit[A](a: => A): M = M.zero def map2[A,B,C](m1: M, m2: M)(f: (A,B) => C): M = M.op(m1,m2)

阅读时,我看到以下类型别名:

type Const[M, B] = M

implicit def monoidApplicative[M](M: Monoid[M]) =
  new Applicative[({ type f[x] = Const[M, x] })#f] {
    def unit[A](a: => A): M = M.zero
    def map2[A,B,C](m1: M, m2: M)(f: (A,B) => C): M = M.op(m1,m2)
  }

Const[M,x]
作为类型别名的含义是什么?我的理解是,对于新创建的
应用程序
,它有一个
[M,B]
类型,其中
B
是在函数级别指定的。

Const[M,x]
没有任何特殊意义,您可以等价地内联它的定义并编写
{type f[x]=M}
({type f[x]=Const[M,x]})#f
定义了一个类型级别的函数。

我不确定为什么会引入这个类型别名--回到那本书中去的好理由!:)

然而,其含义很简单
Const
具有两个类型参数,其中第二个类型参数无关紧要。我希望它能在需要一个具有两个类型参数的类型构造函数的地方使用,但事实并非如此

表达式
({type f[x]=Const[M,x]})#f
被称为类型lambda,它在这里(事实上,在大多数地方)用于将具有两个类型参数的东西,
Const
,转换为具有一个类型参数的东西

现在,有趣的是,由于其在
Const
中的位置,正在接收的类型参数被忽略,取而代之的是
M
,它是
monoidApplicative
定义的类型参数

请注意,
Applicative
需要使用类型参数,这里我们使用的是
M
,其中存在
Monoid[M]
。这类
M
的两个例子是
Int
String
,它们都没有类型参数


因此,在某种意义上,我们是在欺骗
Applicative
,方法是忽略类型参数,最终类型被替换为您想要的任何类型,因此可以说,您可以拥有
Applicative[Int]
,尽管
Int
没有类型参数。

可能重复@KevinWright,啊,因此,我关于
类型别名的问题实际上是关于
类型lamdbas
的问题。这样使用,是的,特定别名只是lambda类型的一部分。我不认为这个问题是关于lambda类型的。我们需要理解类型lambdas来理解这里的
Const
的含义,但是知道类型lambdas并不能解释
Const
的用途。
接收的类型参数被忽略了
-是
类型Const[M,B]
中的
B
?@KevinMeredith我的意思是
f[x]中的
x
,虽然
B
显然也被忽略了。你能说更多关于
类型级功能的事吗,阿列克谢?