[Haskell] Views in Haskell

Brian Hulley brianh at metamilk.com
Mon Jan 29 04:45:54 EST 2007

Claus Reinke wrote:
>    mapA f (nilAP -> ()) = nilA
>    mapA f (consAP -> (h,t)) = consA (f h) (mapA f t)
>    foldA  f n (nilAP     -> ())    = n
>    foldA  f n (consAP -> (h,t)) = f h (foldA f n t)

To me this exactly illustrates why view patterns are a bad idea: you've 
taken some concrete type, abstracted it to replace the actual structure by a 
list structure, then defined map and fold over the list structure. This 
means that map and fold can't take advantage of the actual concrete 
structure and are therefore condemned to use the inefficient linear 
structure imposed by the list abstraction.

For example implementing map over a tree directly, gives the possibility of 
parallel execution since different subtrees can be mapped independently. But 
when you view the tree abstractly as a list, no such parallel execution can 
take place. Therefore surely it is better that map and fold are defined for 
each ADT separately, with the separate definitions hidden behind a type 
class, than to attempt to define them "outside" the definition of the ADT 
using view patterns?


More information about the Haskell-prime mailing list