LINQ表达式是否可以在F#中操作数据?

Ner*_*rve 3 .net linq f# functional-programming coding-style

我是初学F#程序员.我知道,F#是功能性的,并喜欢在那里的数据是通过功能,如管道的样式mapiter功能上集合.仍然,LINQ表达式提供了一种替代的,高度可读的方法来操作集合; 但是,我不确定它是否更为迫切,并且无法使用功能语言.

例如,没有LINQ:

let listOfPrimes n =
    [1UL..n]
    |> List.choose (fun i -> match i with
                             | i when isPrime i -> Some i
                             | _ -> None)
Run Code Online (Sandbox Code Playgroud)

使用LINQ时,我们可以:

let listOfPrimes n =
    query {
        for i in [1UL..n] do
        where (isPrime i)
        select i
    }
    |> List.ofSeq
Run Code Online (Sandbox Code Playgroud)

我注意到在使用LINQ时我们需要将结果序列转换为列表.那么,实际的性能差异是什么?在实际的数据库查询之外,LINQ风格上是不受欢迎的吗?何时使用该场景之外的查询来操作集合数据?

Tom*_*cek 5

我认为这是一个偏好问题 - 有些人更喜欢使用高阶函数编写代码,有些人更喜欢LINQ风格的query表达式.

值得注意的是,还有序列表达式,可以看作是query语法的更简单版本.序列表达式不能让您轻松访问其他查询运算符,但它们可以很好地处理简单的事情,您也可以使用[ ... ]表示法将结果作为列表:

let listOfPrimes n =
  [ for i in [1UL..n] do
      if (isPrime i) then yield i ]
Run Code Online (Sandbox Code Playgroud)

我个人的偏好是:

  • 使用序列表达式进行简单的过滤和投影选择
  • 将高阶函数用于其他操作(可能除了复杂的分组和连接,其中查询表达式更好).
  • 使用查询表达式进行数据库访问