LINQ有多少钱?
我正在研究LINQ,并且查询语言出现(至少在表面上)只不过是Haskell和其他FP语言中的地图和/或列表推导的实现(特别是’map’和’的概括)为’在斯卡拉)。 它是否正确? 语法是否比这更多? 从我正在阅读的这本书(“Essential LINQ”)的令人窒息的语气来看,这里似乎有一些新的或创新的东西。
有整个后端,管道,一阶表达式树和类型等来实现LINQ,但我的问题是关于查询语言本身。
干杯
乔
从function上讲,LINQ只不过是表达monad的语法简化。 Linq to Objects(List-comprehensions – 即使这已经非常有用),你一直在讨论,它只是一个可能的应用程序(类似于Haskell中的List-Monad)。
如果你写
from x in expr1 from y in expr2 select x + y
它只不过是
do x <- expr1 y <- expr2 return $ x + y
在哈斯克尔。
具体的事情取决于用户定义的Linq-providers (扩展方法), Linq.Enumerable
只是一个涉及IEnumerable
的实现。
通过提供一个,您可以为您的类型创建全新的LINQ语义。
示例:给定可能失败的计算的Option
类型(可空值),可以定义Linq提供程序以查询它们。
public static class MaybeExtensions { public static Option ToMaybe (this T value) { return Option .Some(value); } public static Option SelectMany( this Option m, Func> k) { return !m.IsNone ? Option .None : k(m.Value); } public static Option SelectMany( this Option m, Func> k, Func s) { return m.SelectMany(x => k(x).SelectMany(y => s(x, y).ToMaybe())); } }
这将允许我们编写这样的代码:
var sum = from x in ReadNumber("x") from y in ReadNumber("y") select x + y;
如果所有计算成功,计算将仅返回一个值,否则在第一个失败的计算失败时将失败。
结合表达树,Linq可以非常强大,并允许您表达 -
- 数据库访问
- 异步程序流程
- 也许,单子
- 列表理解
- 递归下降解析器
- 延续
- 迷你语言
- 并行计算(PLinq)
一些链接:
- linq提供商列表
- 单子的奇迹
- Linq或语言集成monad
- Linq解析器库
- monad的另一种解释(F#)
结合定点组合器,Linq提供了一个完整的function迷你语言( Linq光线跟踪器 )。
请注意,Scala和F#在for-comprehensions和计算表达式中都有类似的概念,它们都是monadic抽象:
斯卡拉:
for (x <- expr1 y <- expr2) yield x + y
F#:
monad { let! x = expr1 let! y = expr2 return x + y }
气喘吁吁可能适用于所有“明显”的东西,其中一些(如表达树)真的很棒。 语言只是一种访问手段; 你对throw
关键字或它暴露的function感到兴奋吗?
除了读一本关于它的书,你还用过LINQ吗? 我发现它在我的日常编程工作中节省了很多时间。 对我来说,这是抽象的下一步,它可以用来组合不同的数据源,如XML或SQL,并使用相同的“语言”。
此外,我推荐Anders Hejlsberg对函数式编程和LINQ的采访 。
查询语法LINQ的核心实际上并不是很大。 它只是一些非常直接的翻译,方法和lambdas – 所以
var qry = from x in src where x.Foo == "foo" select x.Bar;
字面意思是 :
var qry = src.Where(x => x.Foo == "foo").Select(x => x.Bar);
它对扩展方法一无所知(尽管它们是最常见的(但不仅仅是 )实现),而且没有关于Expression
等等。关键字的数量(以及因此所需的方法实现的数量)并不大。 乔恩曾试图在1小时内实现所有这些(在现场演示中)。 他做得不太好;-p
也许LINQ中更令人印象深刻的部分是允许LINQ用于数据库所需的表达式树支持 – 即lambda表达式,可以编译为委托或代表编写代码的对象模型。 有趣的是,同样的想法深入探讨了DLR解决方案在4.0中的工作方式。
LINQ的灵感来自于HaskellDB,正如Erik Meijer已经多次声明的那样,例如在使用过的编程语言推销员(让大众迷上Haskell)中 ,所以它本身并不是一个新概念。 使用相同的语言查询不同的来源在某种程度上是创新的,尽管之前研究人员已经展示了嵌套关系模型涵盖XML,对象和关系数据库的事实。 对我来说,非常酷的是它已被嵌入到流行的,通用的,主要面向对象的语言中,这在以前是没有做过的。
Scala恕我直言,有能力纳入类似的东西。 到目前为止,对于Scala,我们有Stefan Zeiger的ScalaQuery和Daniel Spiewak的ScalaQL ,它遵循LINQ的脚步。