WhiteHaskellerZにもできる超初心者向けHaskell講座(3)

超人気Haskellerである文(@fumieval)さんによる連載Haskell講座の第3(ry
12
ふみ (DJ Monad) @fumieval

@WhitehackerZ1 すごい!正解です。http://t.co/LGy59TJi の3行目以降をbind.hsにコピーし、新たにコマンドプロンプトを開いてrunhaskell bind.hsと入力して、適当な数値を入れてみてください(cdも忘れずに)

2012-10-19 20:46:05

実はghciとしなくても、直接Haskellファイル(拡張子は.hs)を実行することもできます

コマンドはrunhaskellです

runhaskell [ファイル名] :現在のディレクトリにある拡張子がhsのHaskellプログラムファイルを実行する

前回の宿題の答え

1:p x = x * x * x
2:
3:main = do
4: n <- readLn
5: print $ p n

正解できたでしょうか?
上手く行ったかどうかを確認するためには、この内容を適当なファイルで保存し、上にあるようにrunhaskellで実行して下さい。

ガルヒGarhi @GarhiTech

@fumieval 有難うございます!!!これでいいですか? http://t.co/3RalXylb

2012-10-19 20:54:15
拡大
ふみ (DJ Monad) @fumieval

@WhitehackerZ1 プログラムのほうは正しいです。一旦コマンドプロプロンプト上でCtrl+Dを押し、もう一度runhaskell bind.hsと入力してみてください

2012-10-19 20:55:40
ガルヒGarhi @GarhiTech

@fumieval @WhitehackerZ1 師匠。何度やってもかわりません・・

2012-10-19 21:00:08
ふみ (DJ Monad) @fumieval

@WhitehackerZ1 Ctrl+Dを入力してghciを終了し、コマンドプロンプトがC:\Users\…Documents>になっていることを確認してからrunhaskell bind.hsと入力してください。そして、数値を入力すれば答えが出るはずです

2012-10-19 21:02:49
ガルヒGarhi @GarhiTech

@fumieval できました!!!!が、1回目だけで2回できませんでした・・・ http://t.co/0GoUvntj

2012-10-19 21:07:18
拡大
ふみ (DJ Monad) @fumieval

@WhitehackerZ1 そういう時はもう一度runhaskell bind.hsと入力すれば大丈夫です。無限に入力を受け取りたいときはどうすればよいかは後でわかります

2012-10-19 21:11:18
ふみ (DJ Monad) @fumieval

@WhitehackerZ1 ここで休み時間にします。22時15分頃からリストについて少し触れるつもりです

2012-10-19 21:16:48
ガルヒGarhi @GarhiTech

@fumieval @WhitehackerZ1 はい!宜しく宜しくお願いします!ししょ~!!

2012-10-19 21:17:48
ガルヒGarhi @GarhiTech

@fumieval はい!お待ちしておりました!準備万端でございます。

2012-10-19 22:14:46
ふみ (DJ Monad) @fumieval

@WhitehackerZ1 リストについて触れます。リストは、[0,1,2,3,2,1]などの値の列を表し、これがあれば表現できる幅がぐっと広がります。ghciに[]、[1,2,3]、[1..10]、[2,4..40]と入力すれば、それが表現するリストが表示されます

2012-10-19 22:19:23
ふみ (DJ Monad) @fumieval

@WhitehackerZ1 ここで、前回のbind.hsを使います。:load bind.hsした後に、map p [1,2,3]と入力すると、[1,2,3]のそれぞれの要素にpを適用したものが表示されるはずです

2012-10-19 22:29:45

Haskellにおけるリスト

リストは複数の値を連続して扱うときに使います
記法は、[a,b,c]などとかき、この順番でa,b,cが追加されます
また、[1..10]などのように、ピリオドを2つ書くことで、間を補完してくれます
([1..10] == [1,2,3,4,5,6,7,8,9,10])

また、
p x = x * x * x
であるとき、
map p [1,2,3]
とすれば、後ろのリストの全要素に対してpを適用したものが返ってきます
(map p [1,2,3] == [p 1,p 2,p 3] == [1,8,27])

ガルヒGarhi @GarhiTech

@fumieval @WhitehackerZ1 キター!!!!!できました!!!これで大丈夫ですとね???自身あります! http://t.co/paY6UCcW

2012-10-19 22:33:02
拡大
ふみ (DJ Monad) @fumieval

@WhitehackerZ1 はい、その通りです!Haskellでは、複数の値を連続して処理するのにリストを主に使います。では、map関数がどのような仕組みになっているのか、自分で作ることで理解することを目標にします。まず、マイ ドキュメントにlist.hsを作ってください。

2012-10-19 22:36:59
ふみ (DJ Monad) @fumieval

@WhitehackerZ1 Haskellでは、リストを処理するための特殊な関数の書き方があります。http://t.co/2qtKWa74 まずはリストの総和を求めてみましょう。このコードを、空のリストには0を、それ以外は先頭の値と残りの和f xsを足すようにしてみてください

2012-10-19 22:46:52

f [] = (リストが空っぽの時の値)
f (x:xs) = (任意の値。xは先頭の値、xsはそれ以降のリストが入っており、自由に使える)

右辺をなにかの式にすることで、リストを仮引数として取る函数fが定義できます
ここでは、受け取ったリストの総和を求めることを考えます

(ヒント:[1,2,3,4,5]の総和は、1+2+3+4+5として求めることができます これを素直にプログラムに組み込んでみましょう)

ガルヒGarhi @GarhiTech

@fumieval 師匠・・・ファイルで作業がとまっております。ファイル関連は苦手な分野でして・・・

2012-10-19 22:49:13