2014-04-28 72 views
9

我知道斯卡拉,你可以做type ===>[A, B] = Map[A, B],然後你可以使用中綴表示法來定義def foo: String ===> Int,這與def foo: Map[String, Int]的說法是一樣的。有什麼方法可以利用這個中綴表示法來創建帶有2個參數的類型?例如,我想要這樣的東西:Scala中綴類型別名> 2類型參數?

type A ~> B ~~~> C是別名說Map[A, Pair[B, C]]

反正是有,我可以寫的東西線這樣的:

type A to B -> C作爲別名(A, B, C)類型?

回答

13

有趣的是operator precedence as defined for symbolic methods似乎不適用於符號類型別名。相反,中綴類型別名總是評估左結合:

type -[A,B] = Map[A,B] 
type /[A,B] = Map[A,B] // '/' has higher precedence than '-' as an operator 
classOf[A - B/C] // Class[/[-[A,B],C]] 
classOf[A/B - C] // Class[-[/[A,B],C]] 

不幸的是,這意味着它永遠不可能做到你要求沒有這樣的括號什麼:

classOf[A - (B/C)] // Class[-[A,/[B,C]] 

所以最接近的答案如下:

type ~>[A,B] = Map[A,B] 
type ~~~>[A,B] = Pair[A,B] 
classOf[A ~> (B ~~~> C)] // Map[A,Pair[B,C]] 

Ommitting括號,如果你使用正確的關聯別名(與:結尾)只可能

type ~:[A,B] = Map[A,B] 
type ~~~:[A,B] = Pair[A,B] 
classOf[A ~: B ~~~: C] // Map[A,Pair[B,C]] 

而且,不幸的是,因爲所有類型的別名具有相同的優先級,不可能不帶括號混合左,右關聯的別名。

關於你的問題的第二部分:(A,B,C)Tuple3[A,B,C]的語法糖,它是一個有三個參數的類型。因爲中綴類型只有兩個參數,恐怕我認爲沒有辦法用中綴類型來表示這種類型。你將永遠結束了兩個嵌套的參數類型(例如(A,(B,C))((A,B),C)

+3

很好的說明。直到你的答案沒有意識到優先級不一樣! –

+0

是否有可能實現'A作爲B〜> C'來表示'(A,B ,C)'? – pathikrit

+1

@wrick:我不相信這是可能的在類型層面上。中綴類型只能使用兩個類型參數,但(A,B,C)有三個。只有((A,B),C)或(A,(B,C))是可能的。 –

4

簡答題:沒有。 A ~> B ~> C並不意味着Map[A, Pair[B, C]]

它可能意味着Map[A, Map[B, C]],或Pair[A, Pair[B, C]]

+0

如果我用兩個符號,例如'A〜>乙==> C'? – pathikrit

+0

這工作,只要你得到了這些綴優先權「類型構造函數」,例如你的例子的意思是Map [A​​,Pair [B,C]]'而不是'Pair [Map [A​​,B],C]'一定要檢查Scala的6.12.3節語言規範 –

+3

不能將'A〜> B〜> C'表示爲'Map [A​​,Map [B,C]]'。沒有括號的任何東西都不能表示爲'Map [A​​,Pair [B ,C]]'。看到我的回答。 –