純粋に機能的なプログラミング言語があなたの人生を変える方法。

あなたが仕事で使用しなくても、誰もがHaskellを学ぶべきだと思います。それは美しく、あなたの考え方を変えます。

ハスケル誰?

はじめに:Haskellとは何ですか? Haskellは、怠zyで純粋に機能的なプログラミング言語です。

それは今何ですか?

遅延とは、Haskellがコマンドをすぐには実行せず、結果が必要になるまで待機することを意味します。最初はこれは奇妙に思えるかもしれませんが、いくつかの非常に優れた機能(無限リストなど)を許可します。

evenNumbers = [0、2 ..]

このスニペットは、すべての偶数を含む配列を宣言します。しかし、私たちが言ったように、Haskellは怠zyなので、強制的に計算するまで何も計算しません。

偶数を10個取る

コードはevenNumbersの最初の10個の要素を返すため、Haskellはそれらのみを計算します。

ボーナス:ご覧のとおり、Haskellでは括弧なしで関数を呼び出します。関数の名前に続けて引数を入力します(必要に応じて、ターミナルのように)。

また、Haskellは純粋に機能しているとも言いました。これは、一般に、関数には副作用がないことを意味します。これらは、他の方法でプログラムに影響を与えることなく入力を受け取り、出力を吐き出すブラックボックスです。

ボーナス:これにより、機能を破壊するような不可解な状態がないため、テストがはるかに簡単になります。関数に必要なものは何でも引数として渡され、テストできます。

数学、再帰、およびHaskellがバーに入る

また、Haskellは本当に数学のようなものです。フィボナッチ数列を例に説明します。

数学およびHaskellで定義されているフィボナッチ数列。 Haskellバージョンはまったく最適化されていません

ご覧のとおり、定義は非常に似ています。あまりにも似ているかもしれません。

ループはどこにありますか?

それらは必要ありません! Haskellでフィボナッチ数列を計算するのに必要なのは、これら4行だけです。ほとんど些細なことです。これは再帰的な定義であり、関数がそれ自体を呼び出すことを意味します。理解のために、再帰関数の例を次に示します。

階乗::(積分a)=> a-> a
階乗0 = 1
階乗x = x *階乗(x-1)

呼び出し要因5を計算するときにコンピューターが行うことは次のとおりです。

階乗5 = 5 *階乗4
階乗4 = 4 *階乗3
階乗3 = 3 *階乗2
階乗2 = 2 *階乗1
階乗1 = 1 *階乗0
階乗0 = 1
階乗1 = 1 * 1 = 1
階乗2 = 2 * 1 = 2
階乗3 = 3 * 2 = 6
階乗4 = 4 * 6 = 24
階乗5 = 5 * 24 = 120

このアプローチは非効率的だと思うかもしれませんが、それは真実ではありません。多少の注意を払うと、Cのような速度に達することがありますが、わずかに向上することもあります(詳細については、このstackoverflowスレッドを参照してください)。

待つ!変数はありませんか?

はい、Haskellには変数がありません。定数だけです。理論上、Haskellには変数があります。しかし、ほとんど使用しません。

どうすればいいの?変数なしでコーディングすることはできません。

まあ、ほとんどの言語は必須です。これは、ほとんどのコードが、タスクの実行方法をコンピューターに説明することを意味することを意味します。一方、Haskellは宣言的です。したがって、ほとんどのコードは、必要な結果を定義することになります(定数≈定義)。その後、コンパイラはその方法を見つけ出します。

すでに発見したように、Haskellの関数は純粋です。変更する状態はなく、変数も必要ありません。さまざまな関数を介してデータを渡し、最終結果を取得します。

型システム(いいえ、静的な議論と動的な議論には行きません)

Haskellの型システムを学びながら、私にとって最初のあご落としは代数データ型でした。一見、列挙型に少し似ています。

データハンド=左|右

LeftまたはRightの値を取ることができるHandデータ型を定義しました。しかし、もう少し複雑な例を見てみましょう。

データBinTree =空
          |葉の整数
          |ノードBinTree BinTree

再帰型を使用して、バイナリツリーを定義しています。型定義は再帰的です!

わかりました:Haskellは素晴らしい

  • しかし、どこでもっと学ぶことができますか?私の個人的な提案は、すばらしい無料の本Learn Has a Haskell for Great Good
  • しかし、私は仕事を得るのに役立つ何かが欲しいです! Haskellの優れた機能の多くはJavaScriptでも使用できます(ただし、多少複雑な構文と追加のライブラリを使用します)。詳細については、JSでの実用的なプログラミングの紹介をご覧ください。