class Function ?
There is no class Function built into Haskell; if there were, one could define subclasses of it, e.g. a subclass of invertible functions. It is possible to define the class, to make -> an instance of it and to make ($) as in f$x (but not the usual ``invisible'' application operator as in f x) work with it, e.g. ...
import Prelude hiding(($)) --NB. $ (re)defined below. class Function fnType where ($) :: (fnType t u) -> t -> u apply :: (fnType t u) -> t -> u f $ x = apply f x instance Function (->) where apply f x = f x class (Function fnType) => Invertible fnType where inverse :: fnType t u -> fnType u t data IArrow t u = IFN (t->u) (u->t) instance Function IArrow where apply (IFN f i) x = f x instance Invertible IArrow where inverse (IFN f i) = IFN i f successor = IFN (\x->x+1) (\x->x-1) -- e.g. an Invertible Function predecessor = inverse successor ... successor $ 7 ... etc.
Also see class Pair.
Message: 4 Date: Tue, 29 Oct 2002 10:54:30 +1100 (EST) From: Lloyd Allison ... To: haskell at haskell dot org (under Oct 2002 on haskell_list) Subject: class Function ?
... I would like to have a ``class Function'' which has the operators ``$'', ``.'', etc. and most particularly ``'', so that one can define sub-classes of Function (e.g. functions having inverses, say) that can still be applied in the usual way, i.e. ``f x''. ...
Message: 7 Date: Tue, 29 Oct 2002 07:41:31 +0100 From: Nick Name ... Subject: Re: class Function ?
...
The only thing that should be done is to invent a special name for the
juxtaposition operator (or just to use $), and to let (->) become an
instance of the "Function" class.
I'd also like this, because it would enable stuff like associative maps
used as functions.
-- Vincenzo
Message: 9 Date: Tue, 29 Oct 2002 00:10:09 -0800 From: Ashley Yakeley ...
...
I think function application has to be primitive and not an operator.
Otherwise you would end up with this:
f a is syntactic sugar for
f `juxtapose` a is syntactic sugar for
(juxtapose f) a is syntactic sugar for
(juxtapose ((juxtapose juxtapose) f)) a ... etc. ...
Message: 10 Date: Tue, 29 Oct 2002 09:34:03 +0100 (MET) From: Josef Svenningsson ...
...
Overloading "blank space" or function application has been one of my
favourite haskell jokes for some time. While I have many times thought
that it would be really cute I think that in practice it would be just
unmanagable.
Every function composition would be overloaded and we would
end up with tons of class constraints like
Function a => (a b c) -> b -> c
It would be slow and the types would be unreadable.
> When presenting definitions in Haskell (to myself, or to students),
> I don't like being forced to decide on the representation of functions
> (be it `actual function', array, list, FiniteMap, whatever) too early.
I think this is a non-argument. A good programming style (at least in my
opinion) is to always assume `actual functions' as the representation. You
can always convert bulk type operations later.
An example. Say you have a function foo which takes a map as its first
argument. Just assume the `actual function' respresentation. When a
function bar uses foo but has a different representation of map we just
cast it to a function. ...
[e.g.] foo :: (key -> value) -> ....
bar = ... foo (\key -> lookup map key) ...
Message: 4 Date: Tue, 29 Oct 2002 11:42:04 +0000 From: Jon Fairbairn ...
...
we could just make $ the primitive instead of
juxtaposition (and infix the primary form).
Then f a is shorthand for f $ a and
it stops there. ...
...
Message: 8 Date: Tue, 29 Oct 2002 16:57:17 +0000 From: Jon Fairbairn ...
... The class Function and it's first instance would have to be built in (not too onerous since function application is anyway). Not that I'm necessarily in favour of this, you understand.
On the subject of classes and names, also note:
Subject: Prelude Date: Fri, 24 Oct 2003 01:47:34 -0700 (haskell_list) From: Per Larsson
...
In the prelude, a lot of efforts have been made to overload arithmetic names
and operators for numerical classes. I think it is a pity that the prelude is
considerably more careless with other "good" names which, in my opinion,
should have been included in type classes.
&&, ||, (not): These could have been included in
a Boolean (ComplementedBoolean) class and reused for other
boolean algebras than the Bool data type,
e.g. in library Data.Bits, library Data.Set, lifted for
monads or simply being available for user defined types
e.g. representing logical formulae or parser combinators. ...
... ++, concat ... map
... null, elem, filter, reverse
... and, or, any, all ...
And . . .
Subject: Re: Why are strings linked lists? Date: Thu, 27 Nov 2003 23:49:56 -0800 (haskell_list) From: John Meacham
... Something I'd like to see (perhaps a bit less drastic) would be a String class, similar to Num so string constants would have type String a => a then we can make [Char], PackedString, and whatnot instances. It should at least make working with alternate string representations easier.