id	summary	reporter	owner	description	type	status	priority	milestone	component	version	resolution	keywords	cc
3	Generalize function application and container lookup	jmcarthur	somebody	"These functions all share something in common:


{{{
($) :: (a -> b) -> a -> b
(!!) :: [a] -> Int -> a
(!) :: Ord k => Map k a -> k -> a
(!) :: IntMap a -> Int -> a
}}}


The similarity is clearer if we replace [a], Map k a, and IntMap a with isomorphic function types:


{{{
($) :: (a -> b) -> a -> b
(!!) :: (Int -> a) -> Int -> a
(!) :: Ord k => (k -> a) -> k -> a
(!) :: (Int -> a) -> Int -> a
}}}


They all are a form of function application (or, alternatively, map lookup). I propose some sort of type class for this idea:


{{{
class Mapping m where
    type Domain m
    type Codomain m
    ($) :: m -> Domain m -> Codomain m
}}}

We should also make the partial map lookups total by making their Codomains use Maybe.

Open questions:

 * Are there better names to use?
 * Should we have different operators for different fixities? ($) has a very particular fixity which we might not always want for e.g. list indexing.
 * All the examples above have the codomain as a type parameter. Can we leave out the Codomain type in this type class and just have it take * -> * instead?
 * Are there any other functions that could naturally be in this type class?"	enhancement	closed	major		component1		wontfix		
