[Haskell-cafe] Re: distinguish functions from non-functions in a
class/instances
apfelmus
apfelmus at quantentunnel.de
Fri Dec 7 05:32:56 EST 2007
Philipp N. wrote:
>
> i'm trying to wrap functions (a -> b -> ... -> z) of any arity to functions
> of type ([String] -> y), where list of strings replaces the typed arguments.
>
> one attempt looks like this (here written with type families, you can
> replace it by functional dependencies or what ever):
>
> type family Res x
> type instance Res x = x
> type instance Res (x->y) = Res y
>
> class Nary x where
> nary :: x -> [String] -> Res x
>
> instance Nary x where
> nary x [] = x
>
> instance Nary (x->y) where
> nary f (x:xs) = nary (f $ read x) xs
>
> i hope you can get the idea.
> the problem is, that you cannot distinguish type (x->y) from z, so these
> instances are overlapping.
Exactly. What you want to do is most likely impossible, which I think is
due to polymorphism. What type should the expressions
nary id
nary ($)
have?
Nary only works when the result is a monotype, which means that you
would have to add every concrete monotype as base case
instance Nary Int where nary x [] = x
instance Nary Char where nary x [] = x
instance Nary a => Nary [a] where nary x [] = x
...
etc.
Regards,
apfelmus
More information about the Haskell-Cafe
mailing list