Talk:Hitchhikers guide to Haskell
From HaskellWiki
(Difference between revisions)
(→Solution) |
|||
| (6 intermediate revisions not shown.) | |||
| Line 1: | Line 1: | ||
== Code Indentation: == | == 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! [[User:Mforbes|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: | ||
| + | <haskell> | ||
| + | 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 | ||
| + | </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? | ||
Current revision
Contents |
1 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)
2 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
3 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
4 Knapsack problem?
Surely this is actually an example of bin packing? No?
