Language extension idea (was Re: [Haskell-cafe] Re: OCaml list
sees...)
Tom Pledger
tpledger at ihug.co.nz
Sat Oct 9 05:49:02 EDT 2004
oleg at pobox.com wrote:
[...]
>Actually we merely need to add a deconstructor. Also, we can leave the
>type of elements fully polymorphic. Something like this:
>
>>class List l where
>> nil :: l a
>> cons :: a -> l a -> l a
>> decon :: l a
>> -> w -- on empty
>> -> (a -> l a -> w)
>> -> w
>>
>>instance List [] where
>> nil = []
>> cons = (:)
>> decon [] on_nil on_cons = on_nil
>> decon (h:t) on_nil on_cons = on_cons h t
>>
Yes. That 'decon' function corresponds to the 'case' function I went on
to suggest later in my post, as part of a
data-constructors-as-class-members language extension.
I used 'class List l a | l -> a', not 'class List l', so that there
could be an instance for PackedString.
>we can then write truly generic list-processing functions:
>
>>rev:: List l => l a -> l a
>>rev l = rev' l nil
>> where
>> rev' l acc = decon l acc (\h t -> rev' t (cons h acc))
>>
>
>not in a terribly convenient way though.
>
> *Foo> rev "abc"
> "cba"
>
It could get more convenient, though, if we have
data-constructors-as-class-members and move the familiar list
constructors into the List class. (The following might need to be built
into the compiler, because of the special [] syntax.)
class List l a | l -> a where
[] :: l
(:) :: a -> l -> l
data OrthodoxLinkedList a = NilOLL | ConsOLL a (OrthodoxLinkedList a)
instance List (OrthodoxLinkedList a) a where ...
Then existing definitions of list functions would work at the more
generic level.
Regards,
Tom
More information about the Haskell-Cafe
mailing list