
Oh, so this signature is really a partial application that expects another
parameter to be executed.
So
resultFun :: (h b -> h b') -> (h (a->b) -> h (a->b'))
is
foo :: h b -> h b'
bar :: h (a->b) -> h (a->b')
firstFunction = resultFun foo
result = firstFunction bar
Is this correct?
On Thu, Nov 18, 2010 at 10:52 AM, Daniel Fischer
On Thursday 18 November 2010 16:07:34, MH wrote:
I am looking at signatures for Arrow and Composable classes and I cannot understand some of them. Could you please explain me the following: Let's take for example the following:
class FunAble h => FunDble h where resultFun :: (h b -> h b') -> (h (a->b) -> h (a->b'))
class FunAble h where secondFun :: (h b -> h b') -> (h (a,b) -> h (a,b')) -- for 'second'
in the signatures: resultFun :: (h b -> h b') -> (h (a->b) -> h (a->b')) secondFun :: (h b -> h b') -> (h (a,b) -> h (a,b'))
if (h b -> h b') is the input of these functions where does 'a' comes from in the output?
'a' is arbitrary, so it works for all 'a'. The result of resultFun foo, resp. secondFun foo is a function of type
h (a -> b) -> h (a -> b')
resp.
h (a,b) -> h (a,b')
where the types b and b' have been determined by foo (not necessarily completely, if foo is id, all that has been determined is that b' = b) and 'a' is still arbitrary. The type variable 'a' is fixed or restricted when xxxFun gets its second argument, bar in
resultFun foo bar
resp.
secondFun foo bar.
Thanks,
HTH, Daniel