私は個別の構造で下位部門のコースを教えるつもりです。私がテキスト ブックDiscrete Structures, Logic, and Computabilityを選択した理由の 1 つは、関数型プログラミング言語での実装に役立つ例と概念が含まれているためです。(私も良い教科書だと思います。)
DS の概念を説明し、学生が使用できる、わかりやすい FP 言語が必要です。ほとんどの学生は、せいぜい 1 学期か 2 学期の Java プログラミングしか経験していません。Scheme、Erlang、Haskell、Ocaml、SML を検討した結果、Haskell または標準 ML のいずれかに落ち着きました。以下に概説する理由から、私は Haskell に傾倒していますが、いずれかのアクティブなプログラマーの意見を求めています。
- Haskell と SML の両方にパターン マッチングがあり、再帰アルゴリズムの記述が簡単になります。
- Haskell には、そのようなリストを数学的に表現する方法とうまく一致する優れたリスト内包表記があります。
- Haskell には遅延評価があります。リスト内包表記法を使用して無限リストを構築するのに最適です。
- SML には、関数の定義と使用の両方が可能な真にインタラクティブなインタープリターがあります。Haskell では、関数は別のファイルで定義し、対話型シェルで使用する前にコンパイルする必要があります。
- SML は、理解しやすい構文で関数の引数と戻り値の型を明示的に確認します。例: val foo = fn : int * int -> int. Haskell の暗黙のカリー構文はもう少し鈍いですが、完全に異質というわけではありません。例: foo :: Int -> Int -> Int。
- Haskell はデフォルトで任意精度の整数を使用します。SML/NJ の外部ライブラリです。また、SML/NJ はデフォルトで出力を 70 文字に切り捨てます。
- Haskell のラムダ構文は巧妙で、単一のバックスラッシュを使用します。SML はより明示的です。ただし、このクラスでラムダが必要になるかどうかはわかりません。
基本的に、SML と Haskell はほぼ同等です。Haskell のリスト内包表記と無限リストが大好きなので、Haskell に傾倒しています。しかし、Haskell のコンパクトな構文の膨大な数のシンボルが学生に問題を引き起こすのではないかと心配しています。SOに関する他の投稿を読んで集めたものから、HaskellはFPから始める初心者にはお勧めできません。ただし、本格的なアプリケーションを構築するつもりはなく、単純なアルゴリズムを試すだけです。
どう思いますか?
編集:あなたの素晴らしい回答のいくつかを読んで、私の箇条書きのいくつかを明確にする必要があります.
SML では、インタープリターでの関数の定義と外部ファイルでの関数の定義の間に構文上の違いはありません。階乗関数を書きたいとしましょう。Haskell では、この定義をファイルに入れ、GHCi にロードできます。
fac 0 = 1
fac n = n * fac (n-1)
私にとって、それは明確で簡潔であり、本の数学的定義と一致しています。しかし、GHCi で関数を直接書きたい場合は、別の構文を使用する必要があります。
let fac 0 = 1; fac n = n * fac (n-1)
対話型インタープリターを使用する場合、教育の観点からは、学生がファイルとコマンド ラインの両方で同じコードを使用できると非常に便利です。
「関数の明示的な確認」とは、関数を定義すると、SML がすぐに関数の名前、引数の型、および戻り値の型を通知することを意味します。Haskell では、:type
コマンドを使用する必要があり、やや混乱するカレー表記が表示されます。
Haskell のもう 1 つの優れた点 - これは有効な関数定義です。
fac 0 = 1
fac (n+1) = (n+1) * fac n
繰り返しますが、これは彼らが教科書で見つけるかもしれない定義と一致します。SML ではできません。