2014-04-03 32 views
1

我試圖習慣f#查詢表達式。如何使f#查詢表達式可重用?

首先,他們肯定渴望,這是因爲:

let arr = [1; 2; 3] 
let q = query { for item in arr do select item; count };; 

val arr : int list = [1; 2; 3] 
val q : int = 3 

我想重用的查詢,所以我儘量懶計算:

let arr = ref [1; 2; 3] 
let q = lazy query { for item in !arr do select item; count } 
q.Value;; 

val arr : int list ref = {contents = [1; 2; 3];} 
val q : Lazy<int> = 3 
val it : int = 3 

現在,我要重新evalute查詢:

arr := [1; 2; 3; 4] 
q.Force();; 

val it : int = 3 

所以,什麼也沒有發生,它不會重新計算。我如何多次使用查詢而不重新定義它?

+0

評估後'懶惰'緩存值。 –

+0

對我來說有點奇怪的是,沒有工具來重新評估表達式 – Rustam

+1

有一種工具,它被稱爲函數,正如@Tomas Petricek的回答中所提到的。函數可以被視爲參數化表達式。 –

回答

7

這是很難說什麼是最好的做法是根據您的很小的例子,但編寫可重用的代碼最簡單的方法是寫一個函數:

let q (arr:seq<'T>) = 
    query { for item in arr do select item; count };; 

然後你可以通過重用稱之爲:

> q [1;2;3];; 
val it : int = 3 
> q [1;2;3;4];; 
val it : int = 4 
+2

爲什麼我沒有想到這個? – Rustam