[Haskell-cafe] View patterns
Andrew Coppin
andrewcoppin at btinternet.com
Sat Feb 27 13:11:01 EST 2010
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 list-only 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?
More information about the Haskell-Cafe
mailing list