質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Haskell

Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

Q&A

解決済

1回答

1546閲覧

Haskellのモナドについて。

strike1217

総合スコア651

Haskell

Haskellは高い機能性をもった関数型プログラミング言語で、他の手続き型プログラミング言語では難しいとされている関数でも容易に行うことができます。強い静的型付け、遅延評価などに対応しています。

関数型プログラミング

関数型プログラミングとは、関数を用いて演算子を構築し、算出し、コンピュータプログラムを構成する枠組みです。

1グッド

2クリップ

投稿2019/11/08 05:37

最近Haskellの勉強をしています。
モナドについて分からない点があるので教えてください。
[参考サイト]
箱で考えるFunctor、ApplicativeそしてMonad

1,returnについて。
return :: a -> m a
この関数の文脈mというのは、前後の文脈によって推論されるのでしょうか??

例えば、3つ例を上げます。

Haskell

1return "WHAT" :: Maybe String 2Just 9 >>= \x -> return (x * 10) 3return (0, 0) >>= landLeft 1 >>= ...

一番上は明示的に型を与えているので大丈夫ですね。
2番めは>>=の左辺のJustから推論されてMaybe型になるということで良いんですよね?
3番めはモナド則があるので推論しなくても良さそうですが・・・これは実際には右辺のモナドから推論されるんですか?

2,モナドの連結について。
>>= :: m a -> (a -> m b) -> m b
これは、1つのモナドに関してのみ連結できるという意味で合ってますか?
例えば、Maybe型 >>= State型 というふうに別のモナドを複数連結させることって可能なのでしょうか?
mと書かれていて両辺の型が同じなので、おそらくコレは出来ないものだと考えているのですが、自分の理解で正しいでしょうか?

それに近いものは見つけました↓
MaybeとStateを合成

もし2の質問が正しくて異なる複数のモナドを連結可能でしたら、returnの文脈の型はどうなるのでしょうか?

3,モナドの文脈を外すことはできるのでしょうか?
どこかで、

値を一度モナドの文脈に入れた場合文脈を外すことはできない。

みたいな事が書かれているのを見かけたのですが、これは正しいのでしょうか?
どこに書かれていたか忘れてしまったので、記憶が曖昧なのですが・・・
Maybeモナドみたいなのだとパターンマッチで値を取り出すことができそうですが、任意のモナドに関して一般的にはできないですよね?例えば、IOとか??

わかる方いたら教えてください。

ozwk👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。

  1. 正しいです。return に限らず Haskell の式に含まれる型変数は前後の文脈から推定され、それが一意に定まったときだけコンパイルが通ります。
  2. モナドの連結は一種類のモナドに限られます。複数のモナドの文脈を持たせたい場合などは、参考記事の通り、Monad transformer を使って合成するのが手っ取り早いです。
  3. これは質問そのものが少し的を外しています。「モナド」というのは、* -> m * という形の関数をいくらでも合成して一つの * -> m * に押しつぶすことができる「性質」のことなので、文脈を外せるかどうかは「データ型」の定義に拠ります。例えば、IO 型は文脈を外せないことで有名ですが、これは単にデータ型を展開する方法が提供されていないだけです。Maybe はただの NothingJust の直和型なので、パターンマッチで開けられますし、States -> (a, s) の別名のようなものなので runState で取り出すことができます。モナドであるかどうかと文脈を外すことができるかどうかは関係がないのです。

投稿2019/11/08 05:47

tamoto

総合スコア4105

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

strike1217

2019/11/08 07:41

なるほど。 ありがとうございます。 疑問が解決しました。 また分からない所があったらよろしくおねがいします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問