
Benjamin Franksen wrote:
Because, hmmm, isn't it rather *one* destructor with type
destructShape :: Shape -> (Double -> t) -> (Double -> t) -> t
where the second and third arguments explain what to do with a Circle resp. a Square? So that
case s of Circle r -> f r Square l -> g l
is another way to write
destructShape s g f
I can't resist pointing out that we don't even need destructShape, nor any internal representation of a Shape, because we can make the value itself the deconstructor: Circle :: Double -> (Double -> t) -> (Double -> t) -> t Circle d = \c s -> c d Square :: Double -> (Double -> t) -> (Double -> t) -> t Square d = \c s -> s d Every algebraic data type has a natural representation of this form. I used this idiom extensively in my Lazy K sample code [1] [2]. -- Ben [1] http://homepages.cwi.nl/~tromp/cl/lazy-k.html [2] http://esoteric.sange.fi/essie2/download/lazy-k/eg/