Mads LindstrÃm schrieb:
A function inc5
inc5 :: Float -> Float
inc5 x = x + 5
can only be a member of a type class A, if we make all functions from
Float -> Float members of type class A. Thus, I assume, that _type_
class is named type class, as membership is decided by types.
However, it makes no sense to say that all functions from Float -> Float
are invertible or continuous. We would want to specifically say that
inc5 is continuous, not all Float -> Float functions. Thus, we could
have another abstraction, lets call it _value_ class, where we could say
that an individual value (function) could be member. We could say
class Invertible (f :: a -> a) where
invert :: f -> (a -> a)
instance Invertible inc5 where
invert _ = \x -> x - 5
In many cases this would be too specific. We would like to say, that
applying the first argument to `+` returns an invertible function.
instance Invertible (`+` x) where
invert (x +) = \y -> y - x
We would properly also like to say, that composing two invertible
functions results in another invertible function. I guess there are many
Maybe you could define types like
newtype InvertibleFunction a b = InvertibleFunction (a -> b)
newtype ContinuousFunction a b = ContinuousFunction (a -> b)
newtype AttributedFunction attr a b = AttributedFunction a b
where attr can be Invertible, Continuous, or (Invertible, Continuous).
Then you may define a type class that provides a functional inverse, if
attr shows invertibility.
Haskell-Cafe mailing list