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-... Sent from the Haskell - Hugs-Users mailing list archive at Nabble.com.
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
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-... Sent from the Haskell - Hugs-Users mailing list archive at Nabble.com.
_______________________________________________ Hugs-Users mailing list Hugs-Users@haskell.org http://www.haskell.org/mailman/listinfo/hugs-users
participants (2)
-
napster007 -
Neil Mitchell