[Haskell-beginners] Adding 1 to Just 9
Alex Belanger
i.caught.air at gmail.com
Mon May 14 13:42:21 UTC 2018
Applicative is taking one step further, where the transformation itself
is also in such container/context.
<*> :: Functor => f (a -> b) -> f a -> f b
<*> ~ Maybe (a -> b) -> Maybe a -> Maybe b
<*> ~ Num n => Maybe (n -> n) -> Maybe n -> Maybe n
And the implementation:
(<*>) (Just f) (Just n) = Just (f n)
(<*>) Nothing (Just n) = Just n
(<*>) (Just f) Nothing = Nothing
(<*>) Nothing Nothing = Nothing
Thus, with everything we've learned, we should be able to deal with any
situation thrown at use, using Functor or Applicative.
Given (+1) and 42, I can basic function application with ($) or writing
it (+1) 42.Given (+1) and Just 42, I can use fmap to apply my transformation on
that functor, fmap (+1) (Just 42).Given Just (+1) and Just 42, I can use <*> to apply my transformation
inside a functor (applicative functor) to another functor, Just (+1)
<*> Just 42.Given Just (+1) and 42, I can wrap 42 with Just and again use <*> as
earlier, Just (+1) <*> Just 42.
Hope this helps.
nitrix
On Mon, May 14, 2018, at 9:17 AM, Alex Belanger wrote:
> A first approximative intuition is to think of Functors as containers
> (or more like a context) and of fmap as a way to apply a
> transformation function of your choice on the contained value,
> respecting the signification of that context.>
> For example, Maybe represents the possibility of having or not having
> a value, therefore, fmap will apply your transformation on that value
> if it exists, otherwise you're still left with nothing.>
> This example might seem straight forward but it had to be defined
> somewhere, thus, made possible by the Functor instance implementation
> for the type Maybe.>
> Let's have a look at it:
>
> fmap :: Functor f => (a -> b) -> f a -> f b
>
> Specialized:
>
> fmap ~ (a -> b) -> Maybe a -> Maybe b
>
> And concretize further:
>
> fmap ~ Num n => (n -> n) -> Maybe n -> Maybe n
>
> As you can see, given a transformation function and maybe some
> numeral, you'll get maybe another numeral.>
> The implementation lools like this:
>
> fmap f (Just n) = Just (f n)
> fmap f Nothing = Nothing
>
> Thus, starting with Nothing, we cannot apply our tranformation so you
> stay with Nothing. Similarly, with Just n, we're able to pattern match
> to obtain that n, apply our transformation f on that n, and then
> rewrap everything back into Just.>
> You can see how the value cannot escape its container / context.
>
> Of course there are more complex such containers / context.
>
> Either represents a choice between two values. [] contains multiple
> values, IO contains (side-)effects, and so on.>
> Hope this helps.
>
> nitrix
>
> On Mon, May 14, 2018, 08:18 David McBride <toad3k at gmail.com> wrote:
>> let foo = \x -> Just (x + 1)
>> fmap foo (Just 9)
>>
>> Just (Just 10)
>>
>>
>> On Mon, May 14, 2018 at 8:15 AM, Olumide <50295 at web.de> wrote:
>>> Dear List,
>>>
>>> Chapter 14 of LYH appears to suggest that a Just value can be added
>>> to an Int. Quote from
>>> http://learnyouahaskell.com/for-a-few-monads-more#useful-monadic-functions>>>
>>> "For instance, say we have Just 9 and the function \x -> Just
>>> (x+1). If we map this function over Just 9, we're left with Just
>>> (Just 10).">>>
>>> I've tried the following in ghci but got the error:
>>>
>>> <interactive>:12:1: error:
>>> • Non type-variable argument in the constraint: Num (Maybe a)
>>> (Use FlexibleContexts to permit this)
>>> • When checking the inferred type
>>> it :: forall a. (Num (Maybe a), Num a) => Maybe a
>>>
>>>
>>> Am I reading the quote wrong? Is Just (Just 10) a hypothetical?
>>>
>>> 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/20180514/e57cf46f/attachment.html>
More information about the Beginners
mailing list