2011-04-23 235 views
2

我學習F#和我在努力解析出現Seq.fold智能感知:F#Seq.fold智能感知

val fold : ('State -> 'T -> 'State) -> 'State -> seq<'T> -> 'State 

在C#中,我習慣了Aggregate擴展方法,可以理解完全正常的C#聲明:

(extension) TAccumulate Aggregate<TSource, TAccumulate>(this IEnumerable<TSource> source, TAccumulate seed, Func<TAccumulate, TSource, TAccumulate> func); 

所以爲了瞭解/推斷F#的語法在這種情況下,我一直在試圖建立Seq.foldAggregate,但之間的類比也許這是錯誤的做法。據我所知,->定義了一個函數(或簽名?),但除此之外,我很難讀出所出現的內容。

要清楚,我不需要一個如何使用摺疊的例子;我只是在尋找在Seq.fold intellisense中使用的F#語法的細目。謝謝。

+0

相關的問題,你可能會感興趣:http://stackoverflow.com/questions/104618/what-does-mean-in-f – Benjol 2011-04-26 07:43:29

回答

5

在F#和許多其他的功能語言,'a -> 'b -> 'c -> 'd是以'a'b'c類型的參數作爲輸入*的函數的類型,並返回'd。所以

('State -> 'T -> 'State) 
// 1st  2nd output 

手段,在C#,類型的函數

State func<State,T>(State firstInput, T secondInput); 

('State -> 'T -> 'State) -> 'State -> seq<'T> -> 'State 
//1st input (a function)  2nd  3rd  output 

手段,在C#,類型的函數

State func<State,T>(Func<State, T, State> firstInput, 
        State secondInput, 
        IEnumerable<T> thirdInput); 

*:現在忽略咖喱。

+1

和'firstInput'是'func','secondInput'是'seed','thirdInput'是C#'Aggregate'類比中的'source' – Brian 2011-04-23 16:34:04

1

摺疊是它接收一個函數(FUN)服用式「狀態和類型T的元素並返回類型的值」的元件狀態(('State -> 'T -> 'State)),類型「狀態的值和的元素的序列的功能類型T和返回類型的值`國

基本上,請在F#互動

let sum x y = x+y;; 

下面,你會看到

val sum : int -> int -> int 

這意味着總和採取int和int並返回一個int。如果你能理解這一點,你可以理解任何函數簽名。

還要注意 - >是正確的關聯,當你看到函數接受一個值並將其轉換爲另一個值時,符號將變得更加明顯。

所以上面的實際上爲int - >(INT - > INT)的函數取int和返回一個函數,它接受一個int和返回INT(稱爲鑽營。)