In  f <*> g = \x -> f x (g x), g is the second argument to <*>. The result of f <*> g is a function that takes an argument (x) and gives f x (g x). So basically <*> combines the functions f and g in a particular way to give a new function. In fact, it is the only way to combine them that type checks (and doesn't use undefined or similar).

On Mon, Aug 22, 2016 at 11:13 AM Imants Cekusins <imantc@gmail.com> wrote:
.. actually, I got fg wrong. Caught it by changing g to (/ ):


f::Fractional f => f -> f -> f
f = (+)

g::Fractional g => g -> g
g a = a / 2

h::Fractional h => h -> h
h = (* 10)


fg::Fractional a =>     a -> a -> a
fg = f <$> g
{-  fg a b = (a / 2) + b
    fg a = \b -> (a / 2) + b
-}

fgh::Fractional a =>  a -> a
fgh = fg <*> h
{-  fgh a = fg a (a * 10)
    fgh = \a -> fg a (a * 10)
-}

_______________________________________________
Beginners mailing list
Beginners@haskell.org
http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners