我來自SML背景,對高階函數感覺很舒服。但我並沒有真正理解列表理解。 在List
上有什麼情況下列表理解比高階函數更適合,反之亦然?列表理解與F中的高階函數#
我聽說列表理解比高階函數慢,我應該在編寫性能關鍵函數時避免使用它嗎?
對於這個例子的緣故,看看Projecting a list of lists efficiently in F#其中@ cfern的答案包含使用列表理解和高階功能分別爲兩個版本:
let rec cartesian = function
| [] -> [[]]
| L::Ls -> [for C in cartesian Ls do yield! [for x in L do yield x::C]]
和:
let rec cartesian2 = function
| [] -> [[]]
| L::Ls -> cartesian2 Ls |> List.collect (fun C -> L |> List.map (fun x->x::C))