2014-01-28 212 views
3

阅读Functional Programming in 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) 
    } 

什么是Const[M, x]这里作为一个类型别名的含义是什么?我的理解是,对于新创建的Applicative,它有一个[M, B]类型,其中B在功能级别指定。

+0

可能的重复[什么是在斯卡拉类型lambdas和它们的好处是什么?](http://stackoverflow.com/questions/8736164/what-are-type-lambdas-in-scala-and-what-are - 他们的好处) –

+0

@KevinWright,啊,所以我关于'type aliases'的问题实际上是一个关于'type lamdbas'的问题...... –

+0

用这种方式,是的,那个特定的别名只是lambda类型的一部分。 –

回答

2

我不确定为什么会引入此类别别名 - 回到那本书的充分理由! :)

但是,意思很简单。 Const是有两个类型参数的东西,其中第二个类型参数无关紧要。我期望它被用于某个地方期望一个类型构造函数与两个类型参数,但事实上,它不是。

表达({ type f[x] = Const[M, x] })#f称为型拉姆达,它用在这里(和在大多数地方,作为事实上)的东西,它有两个类型参数,Const,转换成一些需要一个类型参数!现在

,有趣的是,正在接收的类型参数被忽略,因为它的位置在Const,并且,相反,M,这是monoidApplicative定义的类型参数,则使用。

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

所以,从某种意义上说,我们是由其中类型参数被忽略了一招,最终类型作弊Applicative被通过任何你想要更换,所以你可以有一个Applicative[Int],可以这么说,尽管没有一个Int类型参数。

+0

'正在接收的类型参数被忽略' - 是类型Const [M,B]'中的'B'吗? –

+0

@KevinMeredith我在'f [x]'中的意思是'x',尽管'B'显然也被忽略了。 –

0

Const[M, x]没有什么特别的意思,你可以等价地将其定义内联并编写{ type f[x] = M }({ type f[x] = Const[M, x] })#f定义了一个类型级别的函数。

+0

能否请您多说一下'类型级别函数',Alexey? –

+0

Daniel C. Sobral的回答已经很好地解释了它。 –