在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
显然也被忽略了。你能说更多关于类型级功能的事吗,阿列克谢?