を使用することができます。
にあなたに赤い旗であるべき問題「を解決するための最も適切なツールを使用していない」のこのようなものを。あなたのリソースは、それが何であれ、不適切な方法で問題を解決するように教えています。実際のところ、なぜここでCでループを使用しないのですか?あるいは、もし作者が関数型プログラミングを教えたいのであれば、なぜ彼らはC以外の言語を使うだろうか? より良い本を手に入れよう!
それにもかかわらず、ここで私は自分自身が答えを提供して見つける...
まず第一に、は、彼らは両方ループ技術です!私はあなたがは、任意のループを使用することができないと述べているとき、あなたが実際に手続きループ(すなわちループがgoto
、while
、do...while
またはfor
から構築された)、および構築されていない機能ループ(を参照している収集します再帰関数アプリケーションによって)。それらは両方とも技術的にはループであり、Cは手続き型言語であるため、手順ループを使用する必要があります。それにもかかわらず...
パターンがあります!手続きループは、パターンを観察して再現するだけで、機能ループに変換することができます。つまり、すべての手続きループには同等の機能ループがあり、それらはすべて非常に似通っています。下のパターンを探します。ここで
は基本手続きループ含む関数です:
void procedural_loop_on_str(char const *source, size_t source_position, int *dest, size_t dest_position) {
while (source[source_position] != '\0') {
source_position++;
}
}
を...と、ここでは、機能ループの通りです:
void functional_loop_on_str(char const *source, size_t source_position, int *dest, size_t dest_position) {
if (source[source_position] != '\0') {
source_position++;
functional_loop_on_str(source, source_position, dest, dest_position);
}
}
コードの2枚が非常に似ているようです、彼らはいないの?どのような手順ループも、この観察に基づいて機能的に等価なものに簡単に変換できます。ループ内に埋め込まれた余分なコードを追加するだけです。練習として、このコードの同一部分を分離することを検討してください。彼らは一般に両方のコードで同じ場所に座っています。彼らは見つけるのが難しくありません!実際には、ここではそれらの違い、サイド・バイ・サイドです:
while ... if ...
functional_loop_on_str...
が唯一の問題は、この質問には無関係である、バックトラック時には必要である場所に来ます。したがって、手続き型バージョンをと書いて、機能バージョンに簡単に変換できるはずです。
void procedural_loop_on_str(char const *source, size_t source_position, int *dest, size_t dest_position) {
while (source[source_position] != '\0') {
int value, nbytes, success = sscanf(source + source_position, "%d%n", &value, &nbytes);
if (!success) { nbytes = 1; }
else { /* XXX: You do this part!
* You need to do something with value, dest and dest_position */
}
source_position += nbytes;
}
}
を...と、ここでは、パターンを再現ことにより、私たちの機能バージョンに翻訳されています:私はあなたを始めることを許可
void functional_loop_on_str(char const *source, size_t source_position, int *dest, size_t dest_position) {
if (source[source_position] != '\0') {
int value, nbytes, success = sscanf(source + source_position, "%d%n", &value, &nbytes);
if (!success) { nbytes = 1; }
else { /* XXX: You do this part!
* You need to do something with value, dest and dest_position */
}
source_position += nbytes;
functional_loop_on_str(source, source_position, dest, dest_position)
}
}
実際の間でどのように変化したかを少しお知らせ2つの例。パターンのほとんどはまだそこにある!上記の練習を思い出してください。さて、ここで同じことをして、手続き型から機能型への変換時に同じ場所で同じ変更が行われることを知ることができます。
このパターンは、関数型プログラミングとCプログラミングに関する(より良い)本についての(より良い)本を読んだり、パターンを観察するためにこれらの基本的な例を自分で作成したことで分かりました。それにもかかわらず、私は私の信念に立つこと:
- あなた機能ループCでまたはそのことについては、手続き型言語が、特にない Cを使用すべきではありません。 Cが毎日の機能ループのために設計されていれば、標準で最適化が保証されます。ガイドがそうでない場合は、C Kernighan & Richieの祖先(第2版を選んでください)を作成した、巨大な青色の「C」の本のような新しいガイドを選択することを検討してください。私はそれを見つけるためにあなたを残します。
- 手続き型言語を使用しての機能要素を学習しないでください。これは思いがけないものです。スキームを検討する。 Schemeについて本当に素晴らしい "ウィザードブック"があります!
いずれにしても、の本が必要です。
"何が最善の方法です..."ループを使用するには: – Lundin
この種の"解決に最も適したツールを使用しない "問題は、あなたにとっては赤い旗でなければならず、あなたのリソースは何であれ、不適切な方法で問題を解決するよう教えています。実際のところ、ここでCでループを使用しない人はいますか?また、関数型プログラミングを教授したいと思ったら、なぜ非機能型言語を使うのでしょうか?**より良い本を手に入れよう!** – Sebivor