私はいくつかの関数型プログラミング言語で遊んだことがあり、Lisps(特にScheme)で使用されるs-expr構文を本当に楽しんでいます。
また、純粋に関数型言語で作業することの利点もわかります。したがって:
純粋関数型スキーム(または一般的なLisp)はありますか?
私はいくつかの関数型プログラミング言語で遊んだことがあり、Lisps(特にScheme)で使用されるs-expr構文を本当に楽しんでいます。
また、純粋に関数型言語で作業することの利点もわかります。したがって:
純粋関数型スキーム(または一般的なLisp)はありますか?
新しいRacket言語(以前のPLTスキーム)を使用すると、S式(実際には任意の構文)を使用して任意のセマンティクスを実装できます。基本言語は熱心に評価され、動的に型付けされたスキームバリアントですが、その上に構築されたいくつかの注目すべき言語は、レイジースキームとFatherTimeと呼ばれる関数型リアクティブシステムです。
Racketで純粋に関数型言語を作成する簡単な方法は、基本言語を使用し、状態を変更するプロシージャを提供しないことです。例えば:
#lang racket/base
(provide (except-out (all-from-out racket/base) set! ...more here...))
を持たない言語を構成しますset!
。
純粋に機能するLispはないと思いますが、Clojureがおそらく最も近いでしょう。
Clojureの作成者であるRichHickey:
なぜ私はさらに別のプログラミング言語を書いたのですか?基本的に、並行性のために設計された関数型プログラミング用のLispが欲しかったのですが、見つかりませんでした。
Clojureは機能的で、データ型と変数は不変ですが、特別な場合やJavaにドロップダウンすることで変更可能な動作を得ることができます(ClojureはJVMで実行されます)。
これは仕様によるものです-Richによる別の引用は
純粋に関数型プログラミング言語は、コンピューターを加熱する場合にのみ適しています。
Lispプログラマー向けのClojureのプレゼンテーションを参照してください。
純粋関数型スキーム(または一般的なLisp)はありますか?
ACL2定理証明器は純粋なLispです。ただし、これはプログラミングではなく定理証明を目的としており、特に1次プログラムに限定されています。しかし、それはそのニッチで非常に成功しています。とりわけ、2005年のACMソフトウェアシステム賞を受賞しました。
おそらくそうではないでしょう、少なくともおもちゃ/概念実証以外のものとしてではありません。Haskellでさえ100%純粋に機能しているわけではないことに注意してください。秘密のエスケープハッチがあり、中にあるものIO
はすべて、手で手を振るという言葉の意味で「純粋」にすぎません。
それで、あなたは本当に純粋に関数型言語が必要ですか?さまざまな程度の不便さと非効率性で、ほとんどすべての言語で純粋に機能的なコードを書くことができます。
もちろん、普遍的な状態変更を想定している言語は、物事を純粋に保つのに苦痛を伴うので、おそらくあなたが本当に望んでいるのは、不変性を促進する言語ですか?その場合、 Clojureの哲学を見てみる価値があるかもしれません。そして、起動するのはLispです!
最後に、Haskellの「構文」のほとんどが砂糖の厚い層であることを理解してください。基礎となる言語は型付きラムダ計算にすぎず、すべてのコードをそのように書くことを妨げるものは何もありません。ただし、他のHaskellプログラマーからはおかしな外観になるかもしれません。Liskellもありますが、最近はどうなっているのかわかりません。
最後に、実用的な注意事項:楽しみのためにいじくり回すだけでなく、実際に使用するコードを記述したい場合は、純粋なコード/不変のデータ構造を操作する方法を知っている賢いコンパイラが本当に必要になります。
一貫性のない拡張不可能な構文
ここでの「矛盾」とは何ですか?
言語の選択を構文に基づいて行うのは奇妙です。結局のところ、構文の学習には数時間かかります。これは、必要な投資のごく一部です。
それに比べて、速度、型付けの規律、移植性、ライブラリの幅、ドキュメント、コミュニティなどの重要な考慮事項は、生産性を高めることができるかどうかにはるかに大きな影響を及ぼします。
すべての炎の餌を無視すると、不変のスキームをすばやくグーグルで検索すると、いくつかの結果が得られます:http: //blog.plt-scheme.org/2007/11/getting-rid-of-set-car-and-set-cdr.html
30年前にlispkitlisp
がありました。今日それがどれほどアクセス可能かはわかりません。
[それは私が関数型プログラミングを学んだ場所の1つです]
owl lispがあります。これは、すべてのデータ構造が不変になり、いくつかの追加の純粋なデータ構造を持つスキームR5RSの方言です。これは大規模なプロジェクトではありませんが、少数の人々によって積極的に開発され、使用されているようです(Webサイトとgitリポジトリで確認できます)。R7RSサポートとある種の型推論を含める計画もあります。したがって、おそらく本番環境で使用する準備はできていませんが、これは楽しいことかもしれません。
lispの構文が好きなら、Haskellで実際に同じようなことをすることができます
let fibs = ((++) [1, 1] (zipWith (+) fibs (tail fibs)))
let fibs =
脇。Haskell式ではいつでもs-expr構文を使用できます。これは、外側にいつでも括弧を追加でき、問題にならないためです。これは、冗長な括弧のない同じコードです。
let fibs = (++) [1, 1] (zipWith (+) fibs (tail fibs))
そして、ここでは「典型的な」Haskellスタイルです。
let fibs = [1, 1] ++ zipWith (+) fibs (tail fibs)
lispy構文の下でhaskellを使用することを目的としたプロジェクトがいくつかあります。より古く、より死に、そしてより重々しいものは「Liskell」です。より新しく、より生き生きとしていて、より軽量なものは、haspです。一見の価値があると思うかもしれません。