Haskellにおける、リストについての誤解

2013-02-22 | Haskell | コメントはまだありません

uu :: Num a => [a] -> [a]
uu [] = []
uu (x:xs) = x+1:uu xs

あたしが少ない脳みそを搾って自分ではじめて書いた、Haskellの再帰してなんかする、記念すべき関数。
ああ。
一歩進んだー。
Haskellを知る誰もが、あたしが感動している中身のアレさに引くのでありましょうがそんなことはどうでもいい。この一歩が遠い奴もいるのねって学習できてよかったな。

えーと、[1..10]みたいなリストを受け取ってインクリメントして返すだけですが、あたしはそもそもこの書式そのものに納得することができず、イライライライラしておったのであります。
そーいえばphpもpythonも初期の一歩目を踏み越えるのに、たった一歩の小さな段差を上がるのに、数週間を費やしたのでありました。これ学校の授業とかだったらカリキュラムついていけなくて落ちこぼれだよね。
#実際、あたしはサインコサインタンジェントを頭に入れることができず、まごまごしている間に授業は進み、結果なにもわからんまま高校数学ジ・エンドという憂き目を経験しています。

なんとか理解できた断片

どうもHaskellさんは、いやあのカッコだらけの変態言語もそう、リストのことを
「先頭の何か及びそれに連なっている有象無象」
という見方をしているのかなというところに気づきました。誤解かもしれん。
関数の定義とかに、

f (x:xs)

って、もうこの時点でイライラするわけです。
なんで「リスト」とすればいいものを、わざわざ「先頭(x)と何か(xs)」って書き方をするのか。headだのsndだのtailだの、一個目や二個目を取得する仕組みがわざわざ関数になってたりするブサイクさにうんざりしてたわけ。100個目の取得にも関数書くのかい?最後から2個目を取りたいときはどうするんだい?
あたしにとってリストというのは、1個目だろうと最後だろうとさくっと取りに行くことができて、前から3個目が欲しいなーと思ったら

hoge[2]

とやれば取れる、そういうもののことをさしておったわけです。x:xsとかそういう気持ち悪い何かではない。
#もっとも、これは今も納得はしていなくて、たんに3つ目ほしい時どうすんの?x:xsのxsをさらにx:xsに、さらに…ってやって、x:y:z:xs(文法的に正しいかとかは知らないけどイメージだよ)みたいな取り出し方すんの?それってあんぽんたんの所業じゃないの?とは思っています。「3個目を取得する関数」使うとかそういう意図でいってねえぞ。キリないだろそれ。

が、そういう気持ち悪いアレ自体はともかく、連中にとってのリストはそういう3個目をさくっと取ってこれるステキな何かではなく、左端から一個ずつちぎることしか許されていない数珠繋ぎの芋虫を指すのであるということが、なんとなくですが腑に落ちたというわけです。
ながかったー。

#前回の記事は、書きかけを放置していたものです。前回と今回の記事の間には、だいたい1ヶ月くらいの間が開いていたりします。やれやれ。

ついき

ww :: Num a => [a] -> [a]
ww (x:y:z:xs) = x*2:y*3:z*4:xs

*Main> ww [2,2,2,2,2]
[4,6,8,2,2]

ううむ。ううーむ。

About Author

about author

Halipeco

UO@倭国、EQ@Xegony、DOL@乙鯖を経てFF14のアトモスに生息中。
仕事と趣味でPython書いてる。
買った果物に種があると植えるのが趣味。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です