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

2009-01-14 Thread Andrew Coppin

Colin Adams wrote:

2009/1/13 Andrew Coppin andrewcop...@btinternet.com:

  

One of the wonderful things about Haskell is that almost any time anybody
posts code, at least one person will think up an alternative but equivilent
way of achieving the same goal - sometimes by radically different steps.

Maybe we should have a name for this effect?



Confusion.
  


This is a worthy addition to the Humour page, IMHO... :-D

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


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

2009-01-13 Thread Neil Mitchell
Hi

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

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

To my untrained eyes the second looks more complex... It can't be
implemented in the HLint list recursion functions I've got at the
moment since they first search for a pattern-match on []/(:) on the
left to start the process, but maybe one day.

 I have the nice function 'toMaybe' which simplifies this to:
  unfoldr (\n - toMaybe (n0) (n `mod` b, n `div` b))

 Maybe HLint can also suggest non-base functions? ;-)

Yes, sure - but not by default. See
http://code.google.com/p/ndmitchell/issues/detail?id=126

The idea is that if someone wants to maintain a separate Hints file,
say HackageHints.hs, then an individual user can decide to add import
HackageHints to their Hints.hs and use the additional hints, which may
require arbitrary Haskell libraries.

Thanks

Neil
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


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

2009-01-13 Thread Yitzchak Gale
Andrew Coppin wrote:
 Does it suggest unfoldr too?

I think Neil's idea to have this customizable is a good one.
It's often a matter of taste.

I would rarely want to use unfoldr, and I wouldn't want HList
to bother me about it. Instead, I prefer to use iterate for both
of Andrew's examples:

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

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

convert b = map (`mod` b) . takeWhile ( 0) . iterate (`div` b)

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

heap_to_list = map heap_top . takeWhile (not . heap_empty) .
   iterate heap_delete_top

Here is one case where I actually do use unfoldr:

-- Mine free-form user input for occurrences of a data type
readMany = unfoldr $ listToMaybe . concatMap reads . tails

ghci readMany The numbers are 3, 7, and 42. :: [Int]
[3,7,42]

But I don't believe HLint should be expected to come up with
something like that. It's quite rare.

Regards,
Yitz
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


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

2009-01-13 Thread Andrew Coppin

Robin Green wrote:

On Mon, 12 Jan 2009 21:04:35 +0100 (CET)
Henning Thielemann lemm...@henning-thielemann.de wrote:

  

On Mon, 12 Jan 2009, Andrew Coppin wrote:



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

I have the nice function 'toMaybe' which simplifies this to:
   unfoldr (\n - toMaybe (n0) (n `mod` b, n `div` b))



I would use the more general idiom:

 unfoldr (\n - guard (n  0)  return (n `mod` b, n `div` b)


One of the wonderful things about Haskell is that almost any time 
anybody posts code, at least one person will think up an alternative but 
equivilent way of achieving the same goal - sometimes by radically 
different steps.


Maybe we should have a name for this effect?

___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


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

2009-01-13 Thread Colin Adams
2009/1/13 Andrew Coppin andrewcop...@btinternet.com:

 One of the wonderful things about Haskell is that almost any time anybody
 posts code, at least one person will think up an alternative but equivilent
 way of achieving the same goal - sometimes by radically different steps.

 Maybe we should have a name for this effect?

Confusion.
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


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

2009-01-13 Thread John Goerzen
Colin Adams wrote:
 2009/1/13 Andrew Coppin andrewcop...@btinternet.com:
 
 One of the wonderful things about Haskell is that almost any time anybody
 posts code, at least one person will think up an alternative but equivilent
 way of achieving the same goal - sometimes by radically different steps.

 Maybe we should have a name for this effect?
 
 Confusion.

Ah, so Haskell is completely reducible to Perl then? ;-)
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


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

2009-01-13 Thread George Pollard
On Mon, 2009-01-12 at 21:48 +, Robin Green wrote:
   convert b = unfoldr (\n - if n  0 then Just (n `mod` b, n `div`
   b) else Nothing)
  
  I have the nice function 'toMaybe' which simplifies this to:
 unfoldr (\n - toMaybe (n0) (n `mod` b, n `div` b))
 
 I would use the more general idiom:
 
  unfoldr (\n - guard (n  0)  return (n `mod` b, n `div` b))

I have the equivalent in my ‘useful functions’:

 ifM p x = if p then return x else mzero




signature.asc
Description: This is a digitally signed message part
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


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

2009-01-13 Thread Ketil Malde
Colin Adams colinpaulad...@googlemail.com writes:

 One of the wonderful things about Haskell is that almost any time anybody
 posts code, at least one person will think up an alternative but equivilent
 way of achieving the same goal - sometimes by radically different steps.

 Maybe we should have a name for this effect?

 Confusion.

Golfusion?

-k
-- 
If I haven't seen further, it is by standing in the footprints of giants
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


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

2009-01-12 Thread Andrew Coppin

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...?)


___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


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

2009-01-12 Thread Henning Thielemann


On Mon, 12 Jan 2009, Andrew Coppin wrote:


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)


I have the nice function 'toMaybe' which simplifies this to:
  unfoldr (\n - toMaybe (n0) (n `mod` b, n `div` b))

Maybe HLint can also suggest non-base functions? ;-)

http://hackage.haskell.org/packages/archive/utility-ht/0.0.2/doc/html/Data-Maybe-HT.html
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe


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

2009-01-12 Thread Robin Green
On Mon, 12 Jan 2009 21:04:35 +0100 (CET)
Henning Thielemann lemm...@henning-thielemann.de wrote:

 
 On Mon, 12 Jan 2009, Andrew Coppin wrote:
 
  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)
 
 I have the nice function 'toMaybe' which simplifies this to:
unfoldr (\n - toMaybe (n0) (n `mod` b, n `div` b))

I would use the more general idiom:

 unfoldr (\n - guard (n  0)  return (n `mod` b, n `div` b))

-- 
Robin
___
Haskell-Cafe mailing list
Haskell-Cafe@haskell.org
http://www.haskell.org/mailman/listinfo/haskell-cafe