[Haskell-cafe] Re: distinguish functions from non-functions in
a class/instances
Dan Weston
westondan at imageworks.com
Fri Dec 7 15:39:51 EST 2007
Luke Palmer wrote:
> On Dec 7, 2007 7:57 PM, Luke Palmer <lrpalmer at gmail.com> wrote:
>> On Dec 7, 2007 7:41 PM, Dan Weston <westondan at imageworks.com> wrote:
>>> Luke Palmer wrote:
>>>> You can project the compile time numbers into runtime ones:
>>> Yes, that works well if I know a priori what the arity of the function
>>> is. But I want to be able to have the compiler deduce the arity of the
>>> function (e.g. by applying undefined until it is no longer a function),
>>> precisely so I don't have to supply it myself.
>>>
>>> Function arity is (I think) something already known to GHC, so I don't
>>> know why we can't get at it too.
>> No, it is not. Consider:
>>
>> compose f g x = f (g x)
>>
>> What is the arity of f?
>
> Oh, you're saying at run-time, given an object.
No, at compile time. Type is static.
> Still no, by some definition.
>
> compose f g = f . g
>
> compose' f g x = f (g x)
>
> Are you saying that these two exactly equivalent functions should have
> different arity? If not, then is the arity 2 or 3?
Prelude> :t let compose f g = f . g in compose
let compose f g = f . g in compose :: (b -> c) -> (a -> b) -> a -> c
Prelude> :t let compose' f g x = f (g x) in compose'
let compose' f g x = f (g x) in compose' :: (t -> t1) -> (t2 -> t) -> t2
-> t1
The arity is the number of top-level ->
Both are arity 3.
More information about the Haskell-Cafe
mailing list