かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

catを読もう

cat.hsを書いて動かして動作を確認した。
でも,まだdoやらなんやらでよく解からない。
↓みたいなプログラムです。

main = do cs <- getContents
          putStr cs


最初から確認
main = まではOK!


do.....わからん!
本を見ると,doのあとのアクションを上から順番に実行すると書いてある。
何処まで上から順に実行してくれるかというと,インデントをそろえてる所が,その対象になるみたいね。
つまり,
cs <- getContents
putStr cs
が上から順番にってことですか。


そして,よくわからんのが <- っていう演算子
右辺のgetContentsっていうアクションは,標準入力から全部読み込むっていう動きをするらしい。
<-は,変数を値に束縛(bind)する。
変数が,値を束縛じゃないって本にわざわざ書いてあるってことは,普段イメージしてる代入とは違うものらしい。
すっきりしないけど読み進めればいいのかな。


この説明を見て思いついたのが

main = putStr getContents

じゃいけないのか?っていうことだけど,駄目らしい。
putStrは文字列を受け取るけど,getContentsは文字列を返すアクションだからと本に書いてあった。
そういう物なのか?
すごくメンドクサイ気もするしモヤッとするけど止まっててもしょうがないので我慢!*1


そして,今までの解説だと全部の標準入力を受け付けてから出力!みたいな感じだけどそうじゃないらしい。
これも謎だ!!!
catを実行して文字をパチパチ打ち込んでみると

H:\develop\Program\Haskell\cat>cat
hello
hello
world
world
cat
cat
program
program
cat: interrupted  (Ctrl + Cを押した!)

H:\develop\Program\Haskell\cat>

ちゃんと即座に表示されてる!!
謎!


謎と感じてる部分は,遅延評価っていうもののせいらしい。
5章で詳しく解説するからまっとれ!的な事を書いている。う〜ん。

読み返してみて思ったけど,らしいっていう表現多過ぎ

*1:アクションと関数は別物みたいですね。関数の引数にアクションを持っていくとアクションの結果が関数の引数になるわけじゃないみたい