[Haskell-beginners] Functions as Applicatives

Rein Henrichs rein.henrichs at gmail.com
Tue Aug 23 00:01:47 UTC 2016


Here's an example that may help:

> ((==) <*> reverse) "radar"
True

Using the definition for (<*>), we have f = (==) and g = reverse, and this
becomes:

(==) "radar" (reverse "radar")

Or, once we make (==) infix,

"radar" == reverse "radar"

So we might say:

isPalindome x = ((==) <*> reverse) x

And we can *eta reduce* that to get

isPalindrome = (==) <*> reverse

On Mon, Aug 22, 2016 at 4:54 PM Theodore Lief Gannon <tanuki at gmail.com>
wrote:

> Yes, (g x) is the second argument to f. Consider the type signature:
>
> (<*>) :: Applicative f => f (a -> b) -> f a -> f b
>
> In this case, the type of f is ((->) r). Specialized to that type:
>
> (<*>) :: (r -> a -> b) -> (r -> a) -> (r -> b)
> f <*> g = \x -> f x (g x)
>
> Breaking down the pieces...
> f :: r -> a -> b
> g :: r -> a
> x :: r
> (g x) :: a
> (f x (g x)) :: b
>
> The example is made a bit confusing by tossing in an fmap. As far as the
> definition above is concerned, 'f' in the example is ((+) <$> (+3)) and
> that has to be resolved before looking at <*>.
>
>
> On Mon, Aug 22, 2016 at 9:07 AM, Olumide <50295 at web.de> wrote:
>
>> Hi List,
>>
>> I'm struggling to relate the definition of a function as a function
>>
>> instance Applicative ((->) r) where
>>     pure x = (\_ -> x)
>>     f <*> g = \x -> f x (g x)
>>
>> with the following expression
>>
>> ghci> :t (+) <$> (+3) <*> (*100)
>> (+) <$> (+3) <*> (*100) :: (Num a) => a -> a
>> ghci> (+) <$> (+3) <*> (*100) $ 5
>> 508
>>
>> From chapter 11 of LYH http://goo.gl/7kl2TM .
>>
>> I understand the explanation in the book: "we're making a function that
>> will use + on the results of (+3) and (*100) and return that. To
>> demonstrate on a real example, when we did (+) <$> (+3) <*> (*100) $ 5, the
>> 5 first got applied to (+3) and (*100), resulting in 8 and 500. Then, +
>> gets called with 8 and 500, resulting in 508."
>>
>> The problem is that I can't relate that explanation with the definition
>> of a function as an applicative; especially f <*> g = \x -> f x (g x) . Is
>> (g x) the second argument to f?
>>
>> Regards,
>>
>> - Olumide
>> _______________________________________________
>> Beginners mailing list
>> Beginners at haskell.org
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>>
>
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.haskell.org/pipermail/beginners/attachments/20160823/6dcaf0ec/attachment-0001.html>


More information about the Beginners mailing list