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.
- from 
b <- [1..100]can inferenum bconstraint - from call 
chain bcan inferintegral bconstraint - from 
a <- chain bcan infera,bhave same type - from 
length acan inferalist 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
Post a Comment