[Hugs-users] How to print table data in a format and than query it

Neil Mitchell ndmitchell at gmail.com
Tue Jun 2 06:50:10 EDT 2009


Hi

I think this email would be better suited to the haskell-cafe@ mailing
list, it's not really specific to Hugs, but is how to do these things
in Haskell.

Before you post there however I'd read the guidelines at:
http://www.haskell.org/haskellwiki/Homework_help

Thanks

Neil

On Tue, Jun 2, 2009 at 11:39 AM, napster007 <life_vs_time at hotmail.com> wrote:
>
> This part is about embedding a simple query in Haskell. In this assignment
> you are specifically required to exploit Haskell's predefined higher-order
> functions.
> You can use the following Higher Order Functions:
> map, filter, zipWith, any, all, takeWhile, dropWhile
> You can represent a database table with a value of this type:
> data Table = Table
>             String       --table name
>             [String]     --field names
>             [[String]]   --records
> Suppose now we have a value Table n s z. It represents a table whose name is
> n; s specifies the names of the columns in the table; and z is a list of the
> records in the table.
> To keep it simple, you can represent all those values using plain string
> Below is the table represented in that way. The table contains data about
> the top-10 Largest Countries in the world with its corresponding area given
> in square kilometers.
> top10 = Table
>  "LargestCountries"
>  [ "Rank","Country", "Area"]
>  [ [ "1", "Russia", "17,075,400"]
>    , [ "2", "Canada", "9,976,140"]
>    , [ "3", "United States", "9,629,091"]
>    , [ "4", "China", "9,596,960"]
>    , [ "5", "Brazil", "8,511,965"]
>    , [ "6", "Australia", "7,686,850"]
>    , [ "7", "India", "3,287,590"]
>    , [ "8", "Argentina", "2,776,890"]
>    , [ "9", "Kazakhstan", "2,717,306"]
>    , [ "10", "Sudan", "2,505,810"]
>  ]
>
>
> The functionalities that you must implement are listed below:
> 1.      Show a table: write a function that formats a row, and then maps this
> function over a table to format the table.
> 2.      Project a table: write a function that projects a row, and then maps this
> function over a table to project the table.
> 3.      Select from a table: write a function that determines whether a row
> satisfies the given selection criteria, then filter the table using this
> function.
> Functionality 1: Show a Table
> You cannot unfortunately view a table (yet), for example, try to type top10
> in hugs. Hugs will complain that it does not know how to show a table. So,
> this is your first task. Write a function printTable::Table->IO() that can
> nicely print a table like below:
>
> LargestCountries:
> |Rank|Country          |Area        |
> -------------------------------------
> |1   |Russia           |17,075,400  |
> |2   |Canada           |9,976,140   |
> |3   |United States    |9,639,091   |
> |4   |China            |9,596,960   |
> |5   |Brazil           |8,511,965   |
> |6   |Australia        |7,686,850   |
> |7   |India            |3,287,590   |
> |8   |Argentina        |2,776,890   |
> |9   |Kazakhstan       |2,717,306   |
> |10  |Sudan            |2,505,810   |
>
> It will be easier if you first write:
> writeTable::Table->String
> which simply converts a table to a flat string, and then printTable is
> simply:
> printTable=putStr.writeTable
>
> Write your solution modularly. Small sub-functionalities which are used
> repeatedly are best implemented as separate functions, so you can reuse them
> in multiple places.
> Functionality 2: Select Columns
> The next operation you must implement is so-called projection. That is,
> getting a selected set of columns from a table. Consider a function project
> with the following type:
> project::[String]->Table->Table
> The application project fields table returns a new table consisting of only
> the columns from the original table whose names is specified in fields. So,
> for example,
> printTable.project["Rank", "Country"]$top10
> will produce the following table:
>
> LargestCountries:
> |Rank|Country          |
> ------------------------
> |1   |Russia           |
> |2   |Canada           |
> |3   |United States    |
> |4   |China            |
> |5   |Brazil           |
> |6   |Australia        |
> |7   |India            |
> |8   |Argentina        |
> |9   |Kazakhstan       |
> |10  |Sudan            |
>
> Your task is to implement this function project.
> Functionality 3: Select Records
> The next operation is used to select rows (records) from a database.
> Consider a function select with the following type:
> select::String->(String->Bool)->Table->Table
> The application select field p table will return a new table, containing
> only the rows r from the original table such that the value of r at column
> field satisfies the predicate p.
> Here is an example:
> printTable.select "Rank" p $ top10 where p x = read x < (6::Int)
> will produce the following table:
>
> LargestCountries:
> |Rank|Country          |Area        |
> -------------------------------------
> |1   |Russia           |17,075,400  |
> |2   |Canada           |9,976,140   |
> |3   |United States    |9,639,091   |
> |4   |China            |9,596,960   |
> |5   |Brazil           |8,511,965   |
> Implement the function select.
>
>
> --
> View this message in context: http://www.nabble.com/How-to-print-table-data-in-a-format-and-than-query-it-tp23829287p23829287.html
> Sent from the Haskell - Hugs-Users mailing list archive at Nabble.com.
>
> _______________________________________________
> Hugs-Users mailing list
> Hugs-Users at haskell.org
> http://www.haskell.org/mailman/listinfo/hugs-users
>


More information about the Hugs-Users mailing list