I am a student of functional programming, sorry if my question sounds weird--I am trying to wrap my mind around the given type signatures for functions and how they are implemented.
Looking at the signature for ap
(Substitution)
https://gist.github.com/Avaq/1f0636ec5c8d6aed2e45
(a → b → c) → (a → b) → a → c
Is given here as
const S = f => g => x => f(x)(g(x));
Which I think I understand. f
is a function that takes two parameters, a
and b
and returns c
. g
is a function that takes a
and returns b
. So g(a)
returns b
and therefore f(a)(b)
can be written as f(a)(g(a))
, which returns c
.
g(a)
is the substitute for b
?
Ok now I'm looking at a different implementation that still makes sense:
https://github.com/sanctuary-js/sanctuary-type-classes/tree/v7.1.1#ap--applyf--fa-bfa---fb
ap(Identity(Math.sqrt), Identity(64))
The type signature
(f (a -> b), f a) -> f b
Seem similar to
(a → b → c) → (a → b) → a → c
Re-writing the second using a = f, b = a, and c = b I get
(f -> a -> b) -> (f -> a) -> f -> b
Presuming that ap
takes two parameters, where in the first f
could be some functor that contains a function a -> b
and in the second f
some functor that contains a
returning a functor that substitutes the first functor's function with the end point b
given then functor containing a
.
Okay, stepping back, these two things looks vastly different and I can't wrap my mind around how they are somehow saying the same thing.
const S = f => g => x => f(x)(g(x))
ap(Identity(Math.sqrt), Identity(64))
From my understanding, ap(F(g),F(a))
can be express as F(a).map(g)
which, again, I still have a hard time equating to const S = f => g => x => f(x)(g(x))
. Perhaps I'm misunderstanding something.
...maybe my misunderstanding has to do with the expression of ap
and how that correlates to f => g => x => f(x)(g(x))
because I can see how they both express the same signature but I don't see them as the same thing.
Anyone who can lend some cognitive assistance here, I would greatly appreciate it