[Haskell-beginners] Functions as Applicatives

Olumide 50295 at web.de
Tue Aug 23 14:30:13 UTC 2016


On 23/08/2016 12:39, Tony Morris wrote:
> All functions in Haskell always take one argument.

I know that. All functions accept one argument and return a value _or_ 
another function. Is f the latter type?

- Olumide

>
>
> On 23/08/16 21:28, Olumide wrote:
>> I must be missing something. I thought f accepts just one argument.
>>
>> - Olumide
>>
>> On 23/08/2016 00:54, Theodore Lief Gannon 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
>>> <mailto: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 <mailto:Beginners at haskell.org>
>>>     http://mail.haskell.org/cgi-bin/mailman/listinfo/beginners
>>>     <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
>>>
>>
>> _______________________________________________
>> 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
>



More information about the Beginners mailing list