On 04/19/2013 09:35 PM, Wolfgang Jeltsch wrote:
> Hi,
>
> in Curry, we can define a generic function inversion operator as
> follows:
>
>> inverse :: (a -> b) -> (b -> a)
>> inverse f y | f x =:= y = x where x free
>
> Given that KiCS2 supports functional patterns, I tried to implement
> function inversion in a simpler way as follows:
>
>> inverse :: (a -> b) -> (b -> a)
>> inverse f (f x) = x
>
> However, this does not work. Neither does the following:
>
>> inverse :: (a -> b) -> (b -> a)
>> inverse f = \ (f x) -> x
>
> I’m pretty sure that these alternative implementations are not covered
> by the functional patterns extension, but I wonder whether it would be
> reasonable to extend Curry even more such that the above code snippets
> are accepted. What do you think?
In principle this could be done, but such an extension might complicate
the scoping rules which are already non-trivial. Therefore, we
implemented a simple rule to mark functional patterns: if an application
at an argument position is rooted by a function defined in the current
scope, it is interpreted as a functional pattern. Based on this rule,
your example can be defined as follows:
inverse :: (a -> b) -> (b -> a)
inverse f = g
where
local_f x = f x
g (local_f x) = x
This looks not so nice as you expected but does what you want.
Best regards,
Michael
_______________________________________________
curry mailing list
curry_at_lists.RWTH-Aachen.DE
http://MailMan.RWTH-Aachen.DE/mailman/listinfo/curry
Received on Fr Apr 19 2013 - 22:24:06 CEST