Difference between revisions of "Talk:Hitchhikers guide to Haskell"
Jump to navigation
Jump to search
(6 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
== Code Indentation: == |
== Code Indentation: == |
||
+ | Haskell code should be indented using the <haskell> tag: |
||
− | Code is most easily specified by indenting it by a space in the wiki source: |
||
+ | http://www.haskell.org/haskellwiki/HaskellWiki:Syntax_highlighting |
||
− | -- This is some code. |
||
− | sq x = x*x |
||
+ | This also allows for proper cut and paste properties. |
||
− | If two spaces are used to indent, then the code is visually indented: |
||
⚫ | |||
− | -- Indented code. |
||
⚫ | |||
− | However, if two spaces are used, then cutting and pasting the code sample will insert a spurious space that breaks the 2D Haskell layout. Unless there is a way of indenting code visually while preserving the cut an paste layout properties, it seems that one should only use a single space to indent wiki code. |
||
+ | == Problems == |
||
− | (I did not change the interactive code as it is not likely to be cut and pasted over multiple lines. Visually, however, it might be good to remove the extra space here as well...) |
||
+ | When I try to compile, or load into ghci, the following code I get get this error: |
||
⚫ | |||
+ | |||
+ | cd-fit.hs:8:13: |
||
+ | No instance for (Text.Parsec.Prim.Stream s m Char) |
||
+ | arising from a use of `many' at cd-fit.hs:8:13-27 |
||
+ | Possible fix: |
||
+ | add an instance declaration for (Text.Parsec.Prim.Stream s m Char) |
||
+ | In a stmt of a 'do' expression: dirs <- many dirAndSize |
||
+ | In the expression: |
||
+ | do dirs <- many dirAndSize |
||
+ | eof |
||
+ | return dirs |
||
+ | In the definition of `parseInput': |
||
+ | parseInput = do dirs <- many dirAndSize |
||
+ | eof |
||
+ | return dirs |
||
+ | Failed, modules loaded: none. |
||
+ | |||
+ | And I panic. |
||
+ | |||
+ | Code: |
||
+ | <haskell> |
||
+ | module Main where |
||
+ | |||
+ | import Text.ParserCombinators.Parsec |
||
+ | |||
+ | data Dir = Dir Int String deriving Show |
||
+ | |||
+ | parseInput = |
||
+ | do dirs <- many dirAndSize |
||
⚫ | |||
+ | return dirs |
||
+ | |||
+ | dirAndSize = |
||
+ | do size <- many1 digit |
||
+ | spaces |
||
+ | dir_name <- anyChar `manyTill` newline |
||
+ | return (Dir (read size) dir_name) |
||
+ | |||
+ | main = do input <- getContents |
||
+ | putStrLn $ "DEBUG: got input " ++ input |
||
+ | -- compute solution and print it |
||
+ | </haskell> |
||
+ | |||
+ | /Liem |
||
+ | |||
+ | == Solution == |
||
+ | I solved the above problem by adding a signature to one function: |
||
+ | |||
+ | <haskell> |
||
+ | parseInput :: Parser [Dir] |
||
+ | parseInput = ... |
||
+ | </haskell> |
||
+ | |||
+ | If someone explained ''why'' the signature is required, I could die happy. |
||
+ | |||
+ | [[User:Mgm7734|Mgm7734]] 23:29, 30 July 2011 (UTC) |
||
+ | |||
+ | Its because of the [[Monomorphism_restriction]] |
||
+ | |||
+ | == Knapsack problem? == |
||
+ | |||
+ | Surely this is actually an example of bin packing? No? |
Latest revision as of 17:19, 4 June 2012
Code Indentation:
Haskell code should be indented using the <haskell> tag:
http://www.haskell.org/haskellwiki/HaskellWiki:Syntax_highlighting
This also allows for proper cut and paste properties.
P.S. I am really enjoying this article! It provides a very nice practical introduction to Haskell. Thanks! Mforbes 10:08, 17 April 2006 (UTC)
Problems
When I try to compile, or load into ghci, the following code I get get this error:
cd-fit.hs:8:13: No instance for (Text.Parsec.Prim.Stream s m Char) arising from a use of `many' at cd-fit.hs:8:13-27 Possible fix: add an instance declaration for (Text.Parsec.Prim.Stream s m Char) In a stmt of a 'do' expression: dirs <- many dirAndSize In the expression: do dirs <- many dirAndSize eof return dirs In the definition of `parseInput': parseInput = do dirs <- many dirAndSize eof return dirs Failed, modules loaded: none.
And I panic.
Code:
module Main where
import Text.ParserCombinators.Parsec
data Dir = Dir Int String deriving Show
parseInput =
do dirs <- many dirAndSize
eof
return dirs
dirAndSize =
do size <- many1 digit
spaces
dir_name <- anyChar `manyTill` newline
return (Dir (read size) dir_name)
main = do input <- getContents
putStrLn $ "DEBUG: got input " ++ input
-- compute solution and print it
/Liem
Solution
I solved the above problem by adding a signature to one function:
parseInput :: Parser [Dir]
parseInput = ...
If someone explained why the signature is required, I could die happy.
Mgm7734 23:29, 30 July 2011 (UTC)
Its because of the Monomorphism_restriction
Knapsack problem?
Surely this is actually an example of bin packing? No?