Home
Reading
Searching
Subscribe
Sponsors
Statistics
Posting
Contact
Spam
Lists
Links
About
Hosting
Filtering
Features Download
Marketing
Archives
FAQ
Blog
 
Gmane
From: Andrew Coppin <andrewcoppin <at> btinternet.com>
Subject: View patterns
Newsgroups: gmane.comp.lang.haskell.cafe
Date: Saturday 27th February 2010 18:11:01 UTC (over 6 years ago)
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?
 
CD: 3ms