Haskellのdo式とは?モナド解説のシンタックスシュガー

このQ&Aのポイント
  • Haskellのdo式は、(>>=)演算子の表記を直感的にするためのシンタックスシュガーです。
  • do式を使わずに同じ結果を得る方法もありますが、(>>=)演算子を使用する場合は、強引な記述が必要です。
  • do式は、モナドの解説を兼ねており、より直感的にコードを書くことができます。
回答を見る
  • ベストアンサー

Haskell の do 式について

Haskell を勉強中ですが、オーム社の「プログラミング Haskell」 の第8章 「関数型パーサー」のところでつまづいています。 「ふつうのHaskellプログラミング」も読んでいます。 関数型パーサーの章ではモナドという言葉は使わずに、実はモナドの解説?と思っているのですが... ここからが本題で、 do式 というのは、 (>>=)演算子の記述をもっと直感的に表すためのシンタックスシュガーと理解しています。実際、以下のように記述すると A B \n が順序良く出力されます。 echoAB1 = do { putChar 'A'; putChar 'B'; putChar '\n'; } ここで、シンタックスシュガーである do 式を使わない方法を考えた場合、 echoAB2 = putChar 'A' >>= \x -> putChar 'B' >>= \x -> putChar '\n' とこの様になるかと思い、実際、同じような結果となります。 1つ目の(==>)演算子の左辺は、 IO() なので 右辺の型は () -> IO a でなければならないので、しょうがなく 1つの引数を受け取るλ式 \x -> putChar 'B' で右辺を表現しています。 疑問に感じるのは、 (>>=) 演算子を使用した場合、このような強引な事をしなければならないのか、それとももっとスマートな方法があるかということです。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.2

ANo.1の者です。本を確認しました。 (>>)演算子は「ふつうのHaskellプログラミング」のp.276に記載されてます。

soumusan
質問者

お礼

ありがとうございます。 そのものズバリが記載されていました。 実は、Programming Haskell や、オライリーの Real World Haskell を購入しているのですが、 もうすこし、ふつうのHaskellプログラミングで、下積みを行おうと思います。

その他の回答 (1)

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

その通りで、(>>=)演算子を使う場合はラムダ式にしてやる必要があります。 「プログラミング Haskell」のもう少し後の章に書いてませんでしたっけ。「ふつうのHaskellプログラミング」の方かもしれないけど。 それでコマンド合成用の(>>)演算子の話も書いてあったと思います。

関連するQ&A

  • 楕円の式の右辺

    例えば、下記のような式の右辺の1は何を表しているのですか?円なら半径の2乗ですが・・・。 x^2/a^2+y^2/b^2=1

  • 数学、式変形の質問

    数学、式変形の質問 a(x+1)^(n+1)+b(x+1)^n…=ax^(n+1)+{a(n+1)+b}x^n+… この左辺から右辺への式変形がよくわかりません 詳しく解説お願いします

  • putchar(getchar())はなぜできない

    途中は省略しますが、 int main(void){ int c; c=getchar(); putchar(c); return 0; } はプログラムとして一文字入力・一文字出力しますが、 すこしプログラムを省略して   c=getchar(); putchar(c); を putchar(gerchar()); とすることは何故できないのか? プログラムの関数と数学の関数は違うという事や、int cでcがchar型でないこと。 これが数学の関数なら引数のない関数は数学にない事。 cは数学でいう代入ではなく、単なる箱で有ること。 getchar()の部分が'A'とかの定数なら領域として確保されているため、 int c; c='A' putchar(c)などせず、putchar('A') とできます。 又、この様な問題がHaskellのモナドに結びついていった。 など何となく分かりますが、いまいちきちんと説明できません。 宜しく願います。

  • haskellの合成関数について

    haskell初心者です。 合成関数(.)について質問があります。 (.)関数の引数はghciの:tで調べると (.) :: (b -> c) -> (a -> b) -> a -> c と出てきます。 これは、第一引数に一引数関数、第二引数に一引数関数、第三引数に定数関数を取る、という解釈で合っていると思います。 また、ghciで次の式 ((+) . (+3)) 5 500 を評価しすると 508が出力されます、エラーはありません。 なぜ二引数関数の(+)を(.)の第一引数に入れてもエラーがでないのでしょうか。 おそらく僕のカリー化や合成関数に関する基礎知識が浅いためこのような疑問が生まれたのだと思います。できればこれらの知識を絡めた回答を希望しますが、わがままは言えません。 よろしくお願いします。

  • ベイズの式の演算記号の考え方

    ベイズの式の表現についてお尋ねします。 通常P(A|B)という形式ですが、P(A|B,C)の場合、意味はP(A|(B,C))ということになるでしょうか。出てきたとき戸惑ったのですが、その後の展開としてはそうなっているようだったのでそういうものかなと思いました。 四則演算の表記の取り決めで掛け算・割り算優先という決まりがあるのかということですが。取り決めが明確でないとP(A|B,C)がP((A|B),C)という可能性もあったと思います。 またP((X|Y)|B)という表式はあり得るでしょうか。P(A|B)においてA←(X|Y)としたわけですが。もしあるとしても、P(X|Y|B)ということはあり得ないですね。 あるいはひょっとしてP((X|Y)|B)=P(X|(Y|B))が成り立つとして(←本当はどうか知りませんが→)結合法則が成り立つからP(X|Y|B)と表記してもよいとか。 出てくる演算記号は"| ,"でその演算子の優先順位の問題なのかなと思いますが。よろしくお願いします。

  • C言語の演算式

    C言語のプログラミングで、4×(1-1/3+1/5-1/7+・・・・・)の式を100000項まで合計した式を作りたいです。答えは3.141591になります。 自分で作成してみたのですが、なかなか上手くいきません。 どうすればよいでしょうか?以下自分の作成したプログラムを「」内に載せます。 答えは0になってしまいます。 「 #include <stdio.h> int main(void) { int i=0,a=1,b; do{ i++; if(i%2) { a+=(-1)/(2*(i-1)+1); } else{ a+=1/(2*(i-1)+1); } }while(i<100000); b=4*a; printf("π=%f\n",b-1); putchar('\n'); return (0); } 」

  • 3次スプラインの式を求めるための行列が解けません

    ttp://www.sigmabase.co.jp/kinyukouza/interpolate/images/inter01_formula08.gif について、a_0、a_1、b_1、b_2、b_3をそれぞれ四則演算と累乗の演算子を使った式で表すと、一体どのような式になるでしょうか? a_0=・・・ a_1=・・・ b_1=・・・ 逆行列のところでつまづいています。 どなたかわかる方いらっしゃいましたらご教授よろしくお願い致します。

  • 式の展開

    式の展開なのですが (a+b)^n= これを展開してまとめるとどうなりますか? 教えたください。 ほんとは式の証明で右辺の最終的な式もでているのですがテキストで表現できません

  • 一次式について

    一次式とはどういうことでしょうか? A-BCがxの一次式になるということはx³,x²の項がない つまり、(x³の係数)=0      (x²の係数)=0 ということと ありました A=x⁴-4x³+6x²+x+5,B=x²-ax-1,C=x²-x+5 で 一次式というのが、(a-3)x³+(b-a+7)x²-abx-b+5 です これがなぜどのようにして(x³の係数)=0      (x²の係数)=0になるのでしょうか? よろしくお願い致します。

  • 5次曲線に接する直線の式の求め方

    どなたか、ご教示お願いします。学問ではなく実務に適応させる必要からの質問です。実験で得られた数十個の点群の系列を最小二乗法の近似式でエクセルの散布グラフから得ました。 F(x)=a*x^5+b*x^4+c*x^3+d*x^2+e*x^1+f a=0.0452 b=-8.6275 c=658.58 d=-25133 e=479520 f=-4E+06 この式で表現されるグラフに F(x)=0.57735*x+g :gは未知数 で示される接線の式を求めたい(g値を求める)のですが可能でしょうか。 可能であれば式をご教示ください。 数値演算の方法でも構いません。

専門家に質問してみよう