2015-05-24 34 views
2

鑑於兩個列表中斯威夫特:斯威夫特展示產品

let rows = ["a", "b", "c"] 
let cols = ["1", "2", "3"] 

是否有可能對他們使用列表中理解,產生以下組合:

squares = ["a1", "a2", "a3", "b1", "b2", "b3", "c1", "c2", "c3"] 

顯然,它可以使用一個「爲完成循環「和類似的結構,但我專門爲基於列表理解的解決方案。我知道Swift可以做一些列表理解(例如,讓evens =數組(過濾器(1 .. < 10){$ 0%2 == 0})),但無法弄清楚它是否可以做類似於下面的一段Haskell中:

let squares = [ r ++ c | r <- rows, c <- cols] 

回答

4

一種可能的方案(現在更新的夫特2):

let rows = ["a", "b", "c"] 
let cols = ["1", "2", "3"] 

let squares = rows.flatMap { 
    row in 
    cols.map { 
     col in 
     row + col 
    } 
} 
print(squares) 
// [a1, a2, a3, b1, b2, b3, c1, c2, c3] 

map()cols陣列映射到與預置到每個條目 行數的陣列。外flatMap()映射 rows陣列到陣列(每行一個)和flattens的結果。

稍微更一般的,人們可以用所有組合限定兩個 序列的「產物」作爲元組(對)的數組:

func product<S : SequenceType, T : SequenceType>(lseq : S, _ rseq : T) -> [(S.Generator.Element, T.Generator.Element)] { 
    return lseq.flatMap { left in 
     rseq.map { right in 
      (left, right) 
     } 
    } 
} 

,然後用它作爲

let squares = product(rows, cols).map(+) 
+0

良好回答,儘管不如Haskell版本簡潔。我之前沒有看過「flatMap」函數,但它很好地完成了這項工作。 (我仍然需要深入研究編碼的功能風格。) –