I don't know what Monad's m or Functor's f means.Also, I don't understand the notation on the instance side.

Asked 2 years ago, Updated 2 years ago, 402 views

To Box Thinking Functor, Applicative, and Monad-Qiita

Maybe definition was included.

class Monad where    
    (>>=):ma->(a->mb)->mb

And

To Functors, Applied Functors and Monoids-Learn You a Haskell for Great Good!

There was a definition of the functor.

class Functor where  
    fmap::(a->b)->fa->fb

I don't know what this m or f means.

In my previous question, I implemented a type class called Changeable.
I will reprint what is needed for this question.

data Color=Red|Green

class Changeable a where
  change::a->a

instance Changeable Color where
  change Red=Green
  change Green = Red

As mentioned above, the program creates a Color type and the change function replaces Red with Green and Green with Red.

Here I tried to get my senses by using MyMonad, which looks exactly like Monad.

class MyMonad where
  (>>>)::ma->(a->mb)->mb

First write as above, then match Color (this is the word you use to implement Protocol on Swift).I don't know what Haskell says, so please let me know if you know.)

instance MyMonad Color where
  >>

Now that I've written so far, I've stopped working.

When I looked at the Functor, Applicative, and Monad-Qiita that I thought about in the box, the following was how to write Monad to Maybe.

instanceMonad Maybe where
    Nothing > > = func = Nothing
    Just val > > = func = func val

Nothing and Just are written to the left of >>=! I couldn't write it because of the application of instance Changeable.

class Changeable a where
  change::a->a

In the case of a would represent Color if it fits Color, but how should I interpret f in class Functor f and in class MyMonad m and what kind of is it?

I am reprinting this question because it may be easier to get answers from my own Maybe-like MayNull when I asked here instead of Color.

 data MayNulla=Have a | Null deriving Show

If necessary, I would appreciate it if you could use MyMonad instead of Color and MayNull to better understand me.

By the way, I think I know how to use it.

 hoge=Just1 -- Replace 1 wrapped in Just with hoge

function that receives and returns inc x=x+1 --x by +1
incWrapedJust x=Just(x+1)--A function that receives x and wraps it back with Just.

hoge>>=incWrapedJust -- just using hoge as an argument
inc<$>hoge--inc can't receive Just and can't return Just but can give Just and can return Just

haskell

2022-09-30 21:53

2 Answers

This may be easy to understand if you look at the document.

The Instances in Monad lists the Monad m, but everything that corresponds to m is a type builder with one type as an argument.The interesting part is Either (I take two types myself).

instanceMonad(Either)where
    Left > > =_ = Left l
    Right r>>=k=kr

Therefore, Color cannot be an instance of MyMonad. For example, can you write MayNull as follows?

instance MyMonad MayNullwhere
    -- Implementation imitates Maybe
    (Have x) > > > f = f x
    Null>>>_=Null

Note, however, that the Monad class in the standard library must have m as an instance of the Applicative class and must meet the "Monad Rule" as documented.In particular, the latter is not checked by the compiler and must be implemented correctly at the programmer's responsibility.

I don't see the equivalent of "fit", but

instance AB where

When you write something like this, you say, "Type B is an instance of type class A.


2022-09-30 21:53

Nothing and Just are written to the left of >>=!

There was no mention of yet in the answer, so to supplement it, Haskell can write that way when defining an operator.
In general,

instanceSomeTypeClassSomeTypewhere
  ...

What you can write in the ... section of is roughly the same as what you can write when defining a function (although there are minor differences).

So if >= is a normal function, not a method of type Monad class,

module SomeModule where

...

(>>=)::Maybe a->(a->Maybeb)->Maybeb
Nothing > > = func = Nothing
Just val > > = func = func val

and at the top level of the module.

let Nothing >>=func=Nothing
    Just val > > = func = func val
 in
  ...

You can also use let or where to define local variables as described above.

Incidentally, there is also a more familiar (?) way to define an operator, parentheses, and prepositions:

(>>=)::Maybe a->(a->Maybeb)->Maybeb
(>>=) Nothing func=Nothing
(>>=)(Just val) func=func val
--    ^ Note that just val must be enclosed in parentheses

This is no different from Nothing>>=func=... and other intermediate writing methods.


2022-09-30 21:53

If you have any answers or tips


© 2024 OneMinuteCode. All rights reserved.