[Haskell-cafe] unfoldr [ANN: HLint 1.2]

Andrew Coppin andrewcoppin at btinternet.com
Mon Jan 12 14:56:03 EST 2009


Neil Mitchell wrote:
> Hi Andrew,
>
>   
>>> HLint will automatically detect if you should have used a map, a foldr
>>> or a foldl and suggest how to change your code. In the GHC, darcs and
>>> Hoogle code bases there are no obvious map-like functions, which is a
>>> good sign :-)
>>>
>>>       
>> ...What an intriguing idea. Clearly I'm going to have to play with this
>> sometime soon.
>>
>> Does it suggest unfoldr too?
>>     
>
> No, but it could do in the future - I never use unfold's in my code,
> so am not really familiar with them. But I will look into them, do you
> have any examples where it should suggest unfoldr so I can play with
> them?
>   

Off the top of my head, try this:

  convert b 0 = []
  convert b n = n `mod` b : convert b (n `div` b)

(Takes a number and yields the radix-B representation of it. Backwards.)

  convert b = unfoldr (\n -> if n > 0 then Just (n `mod` b, n `div` b) 
else Nothing)

It's also useful for converting a data structure into a list:

  heap_to_list = unfoldr (\h -> if heap_empty h then Nothing else Just 
(heap_top h, heap_delete_top h))

Those are the major uses I'm aware of. I'm sure somebody else will think 
of others. (IIRC, unstream is implemented as an unfold...?)



More information about the Haskell-Cafe mailing list