SelectMany
in C#對應於Scala中的Haskell (>>=)
或flatMap
的綁定。的>>=
在Haskell簽名是:
(>>=) :: Monad m => m a -> (a -> m b) -> m b
所以綁定是用於構建從另一個一元值的操作。
在C#m
在上述簽名的情況下是IEnumerable
,IObservable
,IQueryable
等。IEnumerable
,SelectMany
因此是
IEnumerable<A> -> (A -> IEnumerable<B>) -> IEnumerable<B>
或C#
public static IEnumerable<B> SelectMany<A, B>(this IEnumerable<A> first, Func<A, IEnumerable<B>> selector)
綁定的含義取決於對於monad類型,對於IEnumerable,輸入序列中的每個元素用於創建一個新序列,並將得到的序列序列展平爲pr輸出輸出序列。
還有另一種配方可能會使這個更清晰。單子通常用綁定的實現來描述,單子還必須支持另外兩個操作,map
和join
。
map
對應選擇C#,看起來像:
map :: Monad m => (a -> b) -> (ma -> m b)
所以它是一個「結構保存」在一元價值提升常規功能的方式。
join
具有類型
join :: Monad m => m m a -> m a
所以加入用於壓平嵌套單子值。在C#這看起來像
public static IEnumerable<A> Join<A>(this IEnumerable<IEnumerable<A>> nested)
bind
可以在地圖方面來實現,並且加入成爲
m >>= f = join (map f m)
所以要回答原來的問題,SelectMany
對應於bind
或flatMap
其他語言。綁定不僅僅是扁平化,而是可以看作是一個變換,然後是嵌套的一元值變平(例如,在IEnumerable<T>
的情況下,序列)。 join
對於IEnumerable<T>
在當前的linq擴展中不存在。
來源
2013-11-23 20:36:03
Lee
SelectMany是地圖。 http://stackoverflow.com/questions/6820866/what-function-acts-as-selectmany-in-jquery –
SelectMany isomorphic綁定。 ' SelectMany的第一個簽名與單一的「綁定」操作符是同構的,在Haskell中寫成>> =。其中一個原因是爲了確立LINQ在已建立的單子架構基礎上的基礎。這個基礎使得LINQ可以適用於各種各樣的事情,比如可組合狀態傳播,異常,延續,替代等等:所有monad。 http://stackoverflow.com/questions/422958/how-c-sharp-compiler-choose-selectmany-when-translating-linq-expression –
相關連接。在SQL Server中,這將是一個'CROSS APPLY'。 – usr