The opposite of Seq.take is Seq.skip. Seq.skip, as the name suggests, skips the first n items of the sequence and returns a new sequence that starts with element n + 1:
let xs = seq [1..10] let skipped5 = xs |> Seq.skip 5 // val skipped5 : seq<int> = // [6; 7; 8; 9; 10]
One of most obvious applications of Seq.skip is to pair it with Seq.take or Seq.truncate to page through a set of records. Perhaps you have a list of books:
type Book =
{ Title : string
Author : string }
let books =
seq [
{ Title = "Wuthering Heights"
Author = "Emily Bronte" }
{ Title = "Jane Eyre"
Author = "Charlotte Bronte" }
{ Title = "Agnes Grey"
Author = "Anne Bronte" }
{ Title = "The Scarlet Letter"
Author = "Nathaniel Hawthorne" }
{ Title = "Silas Marner"
Author = "George Eliot" }
{ Title = "1984"
Author = "George Orwell" }
{ Title = "Billy Budd"
Author = "Herman Melville" }
{ Title = "Moby Dick"
Author = "Herman Melville" }
{ Title = "The Great Gatsby"
Author = "F. Scott Fitzgerald" }
{ Title = "Tom Sawyer"
Author = "Mark Twain" }
]
If each page shows three books, and the user wants to see the records on page three, skip the first two pages’ worth of records, and take the next three records:
let perPage = 3
let page = 3
let records =
books
|> Seq.skip ((page - 1) * perPage)
|> Seq.take perPage
// val records : seq<Book> =
// [{Title = "Billy Budd";
// Author = "Herman Melville";};
// {Title = "Moby Dick";
// Author = "Herman Melville";};
// {Title = "The Great Gatsby";
// Author = "F. Scott Fitzgerald";}]
Unfortunately, like Seq.take, if you ask the sequence for more elements than it contains, it throws an exception:
let oops = seq [1..5]
|> Seq.skip 6
|> printfn "%A"
// System.InvalidOperationException:
// The input sequence has an insufficient
// number of elements.
2 replies on “F# Friday – The Seq.skip Function”
[…] F# Friday – The Seq.skip Function – Brad Collins […]
[…] is this useful? Well, you can take my paging example from my F# Friday post on Seq.skip and make it slightly clearer without the (page – 1) * perPage […]