-3

関数型プログラミングにおける「方法を考えるのではなく、何をするか」(ステップではなく結果に焦点を当てる) という概念を理解するのに苦労しています。関数を第一級市民として扱い、反復用の組み込み関数を持たない言語があるとします (Scala の forAll など)。その場合、まず、与えられたデータ構造を反復する方法を指示する関数を作成する必要がありますよね? したがって、言語自体が十分な機能を提供しない場合、ファーストクラスの市民として機能することを除けば、命令型のコーディングとほとんど同じではないでしょうか?

私が間違っている場合は、私を修正してください。以下は私が参照したリソースです。

ビデオレクチャー

一部の記事

4

1 に答える 1

2

「どのように」と「何を」はコインの裏表であり、何らかの方法で考えると役立つ場合があります。「何」をするかを考えることは、特に再帰関数を書いた経験があまりない人にとって、再帰について考える良い方法です。「どのように」は一連のステップを意味し、「何を」は一連の定義を意味します。繰り返しの例を考えてみましょう (私は Scala を知らないので Haskell を使用しますが、概念は直接翻訳可能でなければなりません)。

Haskell の反復関数は と呼ばれますがmap、自分で書きたいとします。再帰の経験があまりない場合、別の関数 ( ) をリストのすべての要素にmap適用する関数 ( ) の書き方 ( の「マッピング」) を想像するのは難しいかもしれません。必要な関数の型シグネチャは次のとおりです。fflist

map :: (a -> b) -> [a] -> [b]

それでは、リストのすべての要素に適用される関数が「何」であるかを考えてみましょう。これは、最初の要素に適用される関数であり、その後にリストの残りの部分にマップされる関数が続きます。それでは、次のようにコーディングしましょう。

map f (firstElement:restOfList) = (f firstElement):(map f restOfList)

これでほぼ完了です。残っているのは、ベースケースを処理することだけです。リストが空の場合はどうなりますか? 明らかに、空のリストにマップされた関数はすべて空のリストであるため、次のようにコーディングします。

map _ [] = []

これで完了です。「どのように」という観点から考えて上記のコードを書くことができるなら、すぐに進んでください (私はより多くの経験を積んでいるので、より頻繁にそうする傾向があります)。しかし、「何を」という観点から考えることは、行き詰まった場合に役立つテクニックです。

于 2013-02-25T02:47:45.053 に答える