Nested list comprehensions in Haskell -


i following haskell tutorial , on higher order functions section. defines function called chain as:

chain :: (integral a) => -> [a] chain 1 = [1] chain n     | n = n:chain (n `div` 2)     | odd n = n:chain (n * 3 + 1) 

there exercise find number of "chains" have length longer 15. this:

numlongchains :: int   numlongchains = length (filter islong (map chain [1..100]))       islong xs = length xs > 15 

i trying come list comprehension instead of giving me number of chains gives me list of chains longer 15 [1..100]. closest attempt far looks like:

[ [ | <- chain b, length > 15] | b <- [1..100]] 

but get:

<interactive>:9:14: no instance (integral [a0]) arising use of `chain' possible fix: add instance declaration (integral [a0]) in expression: chain b in stmt of list comprehension: <- chain b in expression: [a | <- chain b, length > 15]  <interactive>:9:45:     no instance (enum [a0])       arising arithmetic sequence `1 .. 100'     possible fix: add instance declaration (enum [a0])     in expression: [1 .. 100]     in stmt of list comprehension: b <- [1 .. 100]     in expression:       [[a | <- chain b, length > 15] | b <- [1 .. 100]]  <interactive>:9:46:     no instance (num [a0]) arising literal `1'     possible fix: add instance declaration (num [a0])     in expression: 1     in expression: [1 .. 100]     in stmt of list comprehension: b <- [1 .. 100] 

am close? want solve problem using nested comprehension sake of learning despite possible better ways approach this.

you're close. you're looking for:

[ | b <- [1..10], let = chain b, length > 15 ] 

the expression

[ [ | <- chain b, length > 15] | b <- [1..100]] 

has type:

integral [a] => [[[a]]] 

which not want, because of haskell's polymorphic numeric literals, could possibly type check if correct definition in place.

in case b inferred list of type, , why see error:

no instance (integral [a0]) ... 

here complete run down on how types inferred.

  1. from b <- [1..100] can infer enum b constraint
  2. from call chain b can infer integral b constraint
  3. from a <- chain b can infer a , b have same type
  4. from length a can infer a list of something, e.g. a ~ [t]

so (3) , (4) can infer b ~ [t] , need both integral [t] , enum [t] type t.

to further elaborate on (3), know chain b list, e.g. [t] t type of b. a <- chain b know a has same type elements of chain b, i.e. type of a t.


Comments

Popular posts from this blog

ruby on rails - RuntimeError: Circular dependency detected while autoloading constant - ActiveAdmin.register Role -

c++ - OpenMP unpredictable overhead -

javascript - Wordpress slider, not displayed 100% width -