在Haskell中,有一個函數「take n list」,它返回列表中的前n個元素。例如,「sum(take 3 xs)」總結列表xs中的前三個元素。 F#有相同的嗎?我認爲它是列表功能之一,但我無法找到任何似乎匹配的東西。F#是否與Haskell相當?
回答
是的,它叫Seq.take
。用法與Haskell的相似:Seq.take
計數來源。
要在列表中使用它,請先使用
(更新:顯然是從評論,這是沒有必要的。)List.toSeq
。
爲了澄清一些事情,Seq.take
和Seq.truncate
(如@ sepp2k指出)之間的不同之處在於第二個會給你一個序列返回最多您指定的元素的數量(但如果序列的長度較少,則會給您較少的元素)。
如果您嘗試訪問超出原始列表長度的元素(請注意,Seq.take
函數因爲結果是延遲生成的序列而沒有立即拋出異常),所以生成的序列Seq.take
會引發異常。
此外,您不需要明確地將列表轉換爲序列。在封面下,list<'a>
是繼承自seq<'a>
類型的.NET類,它是一個接口。 seq<'a>
類型實際上只是IEnumerable<'a>
的一個類型別名,因此它由所有其他集合(包括數組,可變列表等)實現。下面的代碼將正常工作:
let list = [ 1 .. 10 ]
let res = list |> Seq.take 5
但是,如果你想獲得類型的結果list<int>
你需要序列轉換回列表(因爲名單是更具體的類型不是順序):
let resList = res |> List.ofSeq
我不知道爲什麼F#庫不提供List.take
或List.truncate
。我猜想目標是避免爲所有類型的集合重新實現整套功能,所以那些在使用更具體的集合類型時序列實現足夠好的應用程序僅在Seq
模塊中可用(但這只是我的猜測...)
很好的說明。 – McMuttons 2010-04-13 21:14:07
@McMuttons:謝謝!我不確定我是否應該發佈它,因爲大部分內容都已在評論中提及。所以,我很高興它已被使用! – 2010-04-13 22:11:40
Seq.take的工作,正如其他人已經指出的那樣,但是列表中的所有Seq操作都需要付出代價。就Seq.take而言,這並不奇怪,因爲該列表必須複製。
更值得注意的是,例如,列表中的Seq.concat比List.concat需要更多的時間。
我想這意味着當你調用一個Seq.xxx函數時,你不會僅僅把它作爲一個seq來訪問,而且這個列表在後臺也被複制/轉換爲一個Seq。
編輯:我畫了上述結論的原因,是這樣的替補使用F#互動:
#time "on";;
let lists = [for i in 0..5000000 -> [i..i+1]];;
Seq.length (Seq.concat lists);;
List.length (List.concat lists);;
在我的機器中,List.length
版本大約需要1.9秒,而Seq.length
版本大約需要3。8秒(僅限長度線重複測試的最短時間,不包括列表生成線)。
- 1. F#相當於Haskell scanl/scanr
- 2. 是否有與C#中的F#Seq.windowed相當的功能?
- 3. F#相當於toLookup
- 4. 是否存在與透明持久性的Python「shelve」相當的Haskell?
- 5. Scala是否具有相當於F#的「類型」?
- 6. 在Prolog中是否有相當於Haskell的enumFromTo?
- 7. F#。 Tuple與否
- 8. 是否有與HighLine相當的Python?
- 9. 是否有與eventfd相當的Windows?
- 10. 是否有與Oracle相當的mysqldump
- 11. 是否有與NSPredicate相當的Java?
- 12. 是否存在與gitosis相當的Mercurial?
- 13. 是否有與Haxe相當的atexit()?
- 14. 是否有與VBScript相當的log4j?
- 15. 是否有與Java MessageFormat相當的Ruby?
- 16. 是否有與MISRA C相當的Java?
- 17. 是否有與frexp相當的Java?
- 18. 是否有與IFNULL相當的Objective-C?
- 19. 是否有與CSS/sass相當的JavaScript
- 20. 是否有與Java相當的getchar?
- 21. 是否有與SignalR相當的Java?
- 22. 是否有與Ruby ruby相當的CoffeeScript?
- 23. 是否有與rails number_to_human相當的angularjs?
- 24. 是否有與LINQ相當的Java?
- 25. Rust是否具有與F#typedefs相同的習慣用法?
- 26. Python:是否有與ndarray.flatten('F')相反的內容?
- 27. Elm是否具有與Haskell相同的「閱讀」
- 28. 是否存在聯合並且與Haskell Prelude實現相交?
- 29. F#與Haskell的where子句一樣嗎?
- 30. 「捲曲-F」 相當於Java
這似乎正是我要找的。現在測試。 :) – McMuttons 2010-04-13 20:16:25
其實,haskell的行爲就像Seq.truncate,而不是Seq.take。 – sepp2k 2010-04-13 20:18:15
由於列表繼承自IEnumerable,因此您無需先將其轉換爲我能看到的序列。在列表中使用Seq.take運行良好。 – McMuttons 2010-04-13 20:23:51