F#をHaskellのような純粋な関数型言語のように動作させることは可能ですか?たぶんいくつかのコンパイラ指令を使用していますか?
PS:私はC / C ++のバックグラウンドを持っているので、Haskellを学ぶことなく関数型プログラミングを学ぶように強制したいと思います:)
F#をHaskellのような純粋な関数型言語のように動作させることは可能ですか?たぶんいくつかのコンパイラ指令を使用していますか?
PS:私はC / C ++のバックグラウンドを持っているので、Haskellを学ぶことなく関数型プログラミングを学ぶように強制したいと思います:)
F#でこの動作を強制することはできませんが、ブライアンが言ったように、規律はあなたの親友です。mutable
たとえば、ループ、キーワードfor
などを使用しないでください。また、純粋に不変のデータ構造(識別された共用体、リスト、タプル、マップなど)を使用します。ある時点でIOを実行する必要がある場合は、純粋関数型コードから分離されるようにプログラムを設計してください。while
ref
関数型プログラミングとは、副作用を制限して分離することです。
いいえ、ごめんなさい。あなたはただ規律を使わなければなりません。
私のような人なら、F#の代わりにHaskellを使用するように強制せず、できるだけ慣用的にHaskellを使用すれば、おそらく「良いもの」を避けるでしょう。オブジェクトの代わりに代数的データ型を使用すること、怠惰を愛することを学ぶこと、モナドを受け入れることなどは、Haskellの核となる部分であり、おそらく純粋関数型プログラミングのより細かい点のいくつかです。
F#は多くの点で学習曲線が急ではありませんが、楽しみのために学習しているように聞こえます。とにかく自分自身に挑戦してみませんか?Haskellを使用した後にF#に移行することで、F#を一般的にどのように使用すべきかをよりよく理解できることを証明できます。
思考の糧。
Haskellの純粋関数型の側面は、言語の基本です。言語間で移植することはできません。これは、主要な設計上の決定につながります。たとえば、Haskellの純粋関数型の性質により、IOモナドが発明されました。F#には、ステートフル計算用のこのような「エスケープバルブ」はありません。
また、関数型プログラミングをサポートしているが、それを完全に強制するわけではない言語でプログラミングすることを学ぶことは、実際には有益かもしれません。多くの人々は、Haskellの個々の設計上の決定(たとえば、IOモナド、再び大きな例を打つため)と、関数型プログラミングが一般的にどのように機能するかについて混乱します。
要するに:いいえ、これはできません。しかし、あなたができることは、非常に注意深く監視し、状態の維持とシーケンス操作を含むすべてのことを質問して、欠落しているより純粋な抽象化がないことを確認することです。
いいえ。現在、F#コンパイラはこのチェックを実行できません。
関数型プログラミングを学ぶためにF#プログラムを書き始めてみませんか?最初にML/Ocaml / F#を学び、次にHaskellに移った人を何人か知っています。
そうすれば、純度をよりよく理解できるようになります。(これまで関数型プログラミング言語に実際に触れたことがない場合は、純粋関数の理解が表面的なものになる可能性があります。)