Help us understand the problem. What is going on with this article?

Haskell 超初心者の学習の記録 (学習2日目)

はじめに

Haskellに興味をもちHaskellの学習を始めました。

今まで、ある程度いろいろな言語を扱ってきたし
言語が変われどさほどの違いはないであろう

と思っていたのですが

なんだか、Haskellはそういう感じではなさそうだと感じました。

初めてプログラムをやり始めた時のような
「ちょっと意味わからないぞ」という懐かしい気持ちを感じています。

この記事は従来のオブジェクト指向、手続き型になれていて
関数型プログラミング言語にほぼ知見のない者が学び始めると
どうなるのか?

関数型について
できるようになるとおそらく忘れてしまうであろう
初心者の時でないと感じられない想いを残したいと思い書いています。

謝辞

まず伝えておきたいのは、私自身は
関数型というものをよく理解していない超初心者ということです。

なので詳しい方達からすると何を言っているんだこいつは
と思うようなことも多々あると思っています。

間違いがあればコメントで訂正していただければと思います。

なぜHaskellの学習を始めたのか

昨今のオブジェクト指向は
ある程度、プログラムの整理術としては有効であるものの
ほとんどのケースにおいて、まともにコードを整理できていないのではないかと思った事がきっかけです。

神クラスや秘伝のタレとなった手を加えられないコードたち
いじるとどこに影響がでるかわからない恐ろしいコードたち

それらをなんとかどうにかして綱渡り状態で乗り切っている
という現場が数多くあるという事をみてきて

結局プログラマーの実力に左右されてしまう
オブジェクト指向ってそもそもどうなんだろうと感じ始めていました。

その矢先に

純粋関数型プログラミング言語では「副作用がない」というキーワードを見かけ

「副作用がない」という環境で作りたいものが作れるのであれば
オブジェクト指向なんてなくなって
純粋関数型プログラミングだけの、副作用のない幸せな世界になるのでは?

という期待を持った事がきっかけです。

正確には

ライブラリが少ないから無理、使用人口が少ないから無理といった
現実的な理由を度外視するのであれば

パフォーマンス上、C/C++が求められる場合のみ
C/C++でオブジェクト指向プログラムをする

そうでないなら「副作用がない」ということを担保できる
純粋関数型プログラミング言語でプログラムをする

というシンプルな世界は理屈上可能なのか?
という事が気になったためです。

そこで純粋関数型プログラミング言語とされている
Haskellに興味をもち学習を始めました。

長々と書きましたが以下からが本題の学習の記録です。

何で学ぶべきかで迷う

調べてみると日本語の書籍もでているみたいですが
地味にお値段が高く、貧乏な私は手を出しにくい。

そこでKindle unlimitedで探して
英語ですが無料で読めるLEARN HASKELL QUICKLYから始めました。

現在はこの本をみながら学習を進めていますが
レビューもついておらず、内容も説明のない構文が突如現れることもあり
どこまで有用なのかは不明です。

Haskellの本家サイトに各種書籍のリンクがあり

「すごいH本」の英語版(Online)であればフリーだったりしたので
こちらの書籍で学ぶ方がいいのではないかなーと感じ始めているところです。

(ちなみに私は英語はあまりできません、Google翻訳の助けをかりて読めるレベルです)

従来の手続き型の感覚だと混乱する

y = x + 10
x = 10

この処理は普通に実行してyには20xには10が入るのですが
最初にみた時は、なぜこれが動くんだとなりました。

こういった、従来のプログラムとの感覚の違いというのは
しばしば現れます。

前提知識がそれなりに必要

y = x + 10
x = 10

これがなぜ問題なく動くのか

私が読んでいた書籍では

「Haskellは変数がイミュータブルであり、実際に使う時まで評価を遅らせられる遅延評価だからである」

と解説されていて、なるほどと納得したのですが

解説を理解するにはパソコンの仕組みやプログラムの動く仕組みといった
基礎的な前提知識が必要な気はします。

(たんに私の読んでいる書籍の問題かもしれません。)

プログラムというより数式に近い?

y = x + 10
x = 10

このプログラムを従来のプログラム言語の感覚でみると混乱するのですが
中学校から習い始めた数学の式という感覚でみると
多少混乱は治ると感じます。

プログラムとして考えると、どうにも上から逐次実行という感覚になりますが
数学の式が並んでいるだけと思えば、ただの式に見えてきました。

let (x:xs) = [1,2,3]

let (x:xs) = [1,2,3]

この(x:xs)が特に解説のないまま出現し(これも書籍の問題かもしれません)
意味がわからない状態に陥いりました。

let (x:xs) = [1,2,3]

これはxは1であり、xsは[2,3]になります。

let (x:y:xs) = [1,2,3]

この場合はxは1yは2xsは[3]になります。

いわゆる分割代入(という表現でいいかはわからないですが)という感じでした。

こういうシンプルな形で登場するとまだわかりやすいのですが
突然関数の引数のところに出てきたりするので

そうなると慣れていない私としてはパニックになりました。

おわり

まだ学習2日目なので大した内容ではないかもしれませんが

  • 従来の逐次実行のプログラムの感覚だと混乱する
  • 前提知識が足りないと理解が難しい(C言語ちゃんと理解してるくらい)
  • プログラムを実行すると考えるよりも、数式を展開する考えの方がしっくり
  • (x:xs)みたいな書き方は分割代入

この辺りが難しいと感じました。
引き続きがんばっていこうと思います。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした