[Haskellcafe] View patterns
Simon PeytonJones
simonpj at microsoft.com
Mon Mar 1 03:59:50 EST 2010
 However, as somebody pointed out, the Java version is polymorphic.
 Assuming that length() is defined for multiple types of container, the
 Java version works with lists, arrays, sets, etc. If you try to do this
 in Haskell, you end up with
A standard way to do it would be this:
class ListLike c where
lcase :: c a > LCase a (c a)
lcons :: a > c a > c a
lnil :: c a
data LCase a b = LNil  LCons a b
f :: ListLike c => c (c Int) > Int
f (lcase > LCons (lcase > LCons x (lcase > LNil))
(lcase > LCons (lcase > LCons y (lcase > LCons _ (lcase > LNil)))
(lcase > LNil)))
= x+y
Simon
 Original Message
 From: haskellcafebounces at haskell.org [mailto:haskellcafebounces at haskell.org] On
 Behalf Of Andrew Coppin
 Sent: 27 February 2010 18:11
 To: haskellcafe at haskell.org
 Subject: [Haskellcafe] View patterns

 One somewhat neat thing about Haskell is that you can say

 case list of
 [[x], [y,_], [z,_,_]] > x + y + z
 _ > 0

 In Java, you'd have to write something like

 if (list.length() == 3)
 {
 List t1 = list.at(0);
 if (t1.length() == 1)
 {
 int x = t1.at(0);
 List t2 = list.at(1);
 if (t2.length() == 2)
 ...

 I can't even be bothered to finish typing all that lot!

 However, as somebody pointed out, the Java version is polymorphic.
 Assuming that length() is defined for multiple types of container, the
 Java version works with lists, arrays, sets, etc. If you try to do this
 in Haskell, you end up with

 case size c of
 3 >
 case (c ! 0, c ! 1, c ! 2) of
 (xs, ys, zs)  size x == 1 && size y == 2 & size z == 3 > (xs !
 0) + (ys ! 0) + (zs ! 0)
 _ > 0
 _ > 0

 or similar. Which is shorter than Java, but nowhere near as nice as the
 original listonly version.

 Now I was under the impression that "view patterns" fix this problem,
 but it seems they don't:

 case c of
 (size > 3) >
 case (c ! 0, c ! 1, c ! 2) of
 (size > 1, size > 2, size > 3) > (c ! 0 ! 0) + (c ! 1 ! 0) +
 (c ! 2 ! 0)

 Any suggestions?

 _______________________________________________
 HaskellCafe mailing list
 HaskellCafe at haskell.org
 http://www.haskell.org/mailman/listinfo/haskellcafe
More information about the HaskellCafe
mailing list