如何使f#查询表达式可重用?

Rus*_*tam 1 linq f# lazy-evaluation computation-expression

我试图习惯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
Run Code Online (Sandbox Code Playgroud)

我想重用该查询,所以我尝试延迟计算:

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
Run Code Online (Sandbox Code Playgroud)

现在,我想重新评估查询:

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

val it : int = 3
Run Code Online (Sandbox Code Playgroud)

所以什么也没发生,它不会重新计算.如何在不重新定义的情况下多次使用查询?

Tom*_*cek 7

基于最小的例子很难说最好的方法是什么,但编写可重用代码的最简单方法是编写一个函数:

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

然后你可以通过调用它来重用它:

> q [1;2;3];;
val it : int = 3
> q [1;2;3;4];;
val it : int = 4
Run Code Online (Sandbox Code Playgroud)

  • 我为什么不这么想? (2认同)