2014-01-28 259 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的回答已經很好地解釋了它。 –