<div dir="ltr">hi everyone, i'm a complete beginner on programming and i've been solving the 99 haskell problems and i've come into a situation. just like all my problems with haskell, it's about types. i wrote a little thing that takes a list and puts all the equal characters together, like [1,1,3,2,3] will be [  [1,1],  [3,3], [2]  ]. here it is:<div>
<br></div><div><div>pack xs = pack' xs</div><div><br></div><div>         where</div><div><br></div><div>         pack' :: [a] -> [[a]]</div><div><br></div><div>         pack' [] = []</div><div><br></div><div>
         pack' (x:y) = extra x xs ++ pack' y </div><div><br></div><div><br></div><div><br></div><div>extra x xs = [sum' (map (remover x) (map ((==) x) xs))]</div><div><br></div><div><br></div><div><br></div><div>
remover :: a -> Bool -> [a]</div><div><br></div><div>remover y x = if x then [y] else []</div><div><br></div><div><br></div><div><br></div><div>sum' :: [[a]] -> [a]</div><div><br></div><div>sum' [] = []</div>
<div><br></div><div>sum' (x:xs) = x ++ sum' xs</div><div><br></div></div><div><br></div><div>i know, i know, this code is probably terrible and i'm sure there are more clever ways to do this...but i wanna understand what's wrong. the "extra" function works perfectly, it takes a variable and then looks at how many times it's presented on a list and outputs a list with a list of that variable the amount of times that it was presented on the original list.</div>
<div><br></div><div>however, pack does not work quite right. first of all, it'll use extra on repeated characters, creating repeated lists, but that doesn't matter because i have a function that fixes that issue and i'll use it after i figure out what's wrong with pack. now, the real problem is with types. here's what haskell says when i try to load it:</div>
<div><br></div><div><div>noventa.hs:77:32:</div><div>    Couldn't match type `a' with `a1'</div><div>      `a' is a rigid type variable bound by</div><div>          the inferred type of pack :: [a] -> [[a]] at noventa.hs:73:1</div>
<div>      `a1' is a rigid type variable bound by</div><div>           the type signature for pack' :: [a1] -> [[a1]] at noventa.hs:75:19</div><div>    Expected type: [a1]</div><div>      Actual type: [a]</div>
<div>    In the second argument of `extra', namely `xs'</div><div>    In the first argument of `(++)', namely `extra x xs'</div><div>    In the expression: extra x xs ++ pack' y</div><div>Failed, modules loaded: none.</div>
</div><div><br></div><div><br></div><div>i don't understand this at all! if i replace [a] with String and [[a]] with [String], it works! but i want pack to work for lists of numbers too... types are so confusing. can anyone help me?</div>
</div>