70076


モナド則のひとつ `右恒等性`を確かめていました。

[code]

    Just 5 >>= return -- 結果: Just 5
    
[/code]

こんな `return関数`はどのように実装するんだろうと思って

<https://hackage.haskell.org/package/base-4.14.0.0/docs/Control-Monad.html> の

下記画像下部の`return :: a -> Maybe a # Source` の Sourceと書かれた部分にあたるリンクに飛んでみると下記でした。

[![画像の説明をここに入力](https://i.stack.imgur.com/eJ9YK.png)](https://i.stack.imgur.com/eJ9YK.png)

<https://hackage.haskell.org/package/base-4.14.0.0/docs/src/GHC.Base.html#return>

おそらくこのリンクが飛んだのは下記引用箇所の `return = pure` の部分だと思うのですが、これが return の実装なのでしょうか？

>
[code]

>     class Applicative m => Monad m where
>         -- | Sequentially compose two actions, passing any value produced
>         -- by the first as an argument to the second.
>         --
>         -- \'@as '>>=' bs@\' can be understood as the @do@ expression
>         --
>         -- @
>         -- do a <- as
>         --    bs a
>         -- @
>         (>>=)       :: forall a b. m a -> (a -> m b) -> m b
>  
>         -- | Sequentially compose two actions, discarding any value produced
>         -- by the first, like sequencing operators (such as the semicolon)
>         -- in imperative languages.
>         --
>         -- \'@as '>>' bs@\' can be understood as the @do@ expression
>         --
>         -- @
>         -- do as
>         --    bs
>         -- @
>         (>>)        :: forall a b. m a -> m b -> m b
>         m >> k = m >>= \_ -> k -- See Note [Recursive bindings for
> Applicative/Monad]
>         {-# INLINE (>>) #-}
>  
>         -- | Inject a value into the monadic type.
>         return      :: a -> m a
>         return      = pure
>  
[/code]

同じ理屈で、 `>>=` もソースのリンク先が

<https://hackage.haskell.org/package/base-4.14.0.0/docs/src/GHC.Base.html#%3E%3E%3D>

なのですが、他の[解説サイト](https://qiita.com/suin/items/0255f0637921dcdfe83b)でみてるのとぜんぜん形がちがうように思います。

上記解説サイトから 実装部分を引用します。

>
[code]

>     instance Monad Maybe where
>         Nothing >>= func = Nothing
>         Just val >>= func  = func val
>  
[/code]

なので、てっきり

[code]

    instance Monad Maybe where
        Nothing >>= func = Nothing
        Just val >>= func  = func val
        return .....
    
[/code]

みたいな形で書かれているページに遷移されると思っていたのですが....


CC BY-SA 4.0
2020-09-02T05:44:08.077
70075
2020-09-02T06:07:11.357
2020-09-02T05:58:01.530
9008
9008
question
haskell
Monad Maybeのreturnの実装はどこ？


> おそらくこのリンクが飛んだのは下記引用箇所の `return = pure` の部分だと思うのですが、これが return の実装なのでしょうか？

はい。それが`Maybe`における`return`の実装です。  
型クラスはメソッドを定義する際、メソッドのデフォルトの実装も同時に定義することができます。そうすることによって、このように`Maybe`をはじめとする型が`Monad`を実装する際、`return`の実装を書かなくても済むわけですね。

結果、`instance Monad Maybe where` のブロックには`return`の実装がないため、飛び先が`class Applicative
m => Monad m where`にあるデフォルトの実装になったわけです。

なお、なんで`return = pure`がデフォルトの実装になっているかは[Haskell: Monadクラスのこれまでとこれから -
Qiita](https://qiita.com/mod_poppo/items/8c483951703b5ea0f74e)が参考になるかと思います。

> 同じ理屈で、 >>= もソースのリンク先が

`>>=` については`return`のリンク先が`Monad`のデフォルト実装になっていた関係で、勘違いしてしまったのでしょう。  
実際には
<https://hackage.haskell.org/package/base-4.14.0.0/docs/src/GHC.Base.html#%3E%3E%3D>
に書かれているのは `Maybe` の`Monad`インスタンスの定義ではなく、`Monad`型クラス自体の定義です。  
`Maybe`の`Monad`インスタンスにおける`>>=`の定義は、ちゃんと  
<https://hackage.haskell.org/package/base-4.14.0.0/docs/src/GHC.Base.html#line-1005>  
にあります。言及されている記事のものとよく似ていますね。

余談:

確かに私もこの飛び先については時々混乱します...  
わからなくなったらURLを見たりスクロールしたりして、自分がどこにいるか確認してみてください。


CC BY-SA 4.0
2020-09-02T06:07:11.357
70076
2020-09-02T06:07:11.357
8007
70075
answer