タグ付けされた質問 「functional-programming」

関数型プログラミングは、プログラムの状態ではなく入力によって出力が決定される関数の連鎖評価によって計算問題を解決しようとするパラダイムです。このプログラミングスタイルでは、副作用と可変データは廃止され、通常は厳密に分離されます。

5
なぜメモリからの読み取りは副作用ではなく、ファイルからの読み取りが副作用なのですか?
プロセスメモリからの読み取りを純粋な操作とするのは何ですか?グローバルメモリに100個の整数の配列を作成し、この配列の42番目の要素を取得したとします。副作用ではありませんよね?では、なぜファイルから100個の整数の同じ配列を読み取るのが副作用なのでしょうか?

2
クリーンコードの原則を関数型言語に適用する
現在、Robert MartinのClean Codeを読んでいます。私はそれが素晴らしいと思うし、OOコードを書くとき、私は彼の教訓を心に抱いている。特に、意味のある名前の小さな関数を使用するという彼のアドバイスは、コードの流れをよりスムーズにするものだと思います。次の引用文で簡単に要約できます。 [W] eは、TO段落のセットであるかのようにプログラムを読むことができます。各段落は、現在の抽象化レベルを記述し、次のレベルで後続のTO段落を参照します。 (クリーンコード、37ページ:「TO段落」は、不定詞で表明された文で始まる段落です。「Xを実行するには、ステップYとZを実行します。」「Yを実行するには、...」など。 ) 例えば: RenderPageWithSetupsAndTeardownsでは、ページがテストページであるかどうかを確認し、テストページである場合は、セットアップとティアダウンを含めます。どちらの場合でも、ページをHTMLでレンダリングします 私は自分の仕事のために機能的なコードも書きます。この本のMartinの例は、まるで段落のセットであるかのように読んでおり、非常に明確です。 。 Haskell標準ライブラリから例を取り出します: maximumBy :: (a -> a -> Ordering) -> [a] -> a maximumBy _ [] = error "List.maximumBy: empty list" maximumBy cmp xs = foldl1 maxBy xs where maxBy x y = case cmp x y of GT -> …

8
関数型プログラミングのためのメンタルモデルまたは実世界の比phor
現実世界の何かを参照する機能プログラミングの優れたメンタルモデルやメタファーを持っている人はいますか? オブジェクト指向プログラミングは直感的に理にかなっています。プロパティを持っているものがありますが、時にはプロパティを操作したり、プロパティ(メソッド)を計算したりすることもできます。(例:車、形、猫)。 私は関数型プログラミングに何の害もないし、2つの美徳についての議論には興味がありません。オブジェクト指向プログラミングと同じように、メタファーまたはメンタルモデルが必要です。 機能的パラダイムでプログラミングするための優れたメンタルモデルまたは現実世界のメタファーとは何ですか?機能を処理する機能で構成される機能については、立ち上がって発言するための確固たる場所がなくなります。

1
機能性中間体の欠点
JavaScriptに似た言語のオプティマイザーを作成しているため、中間コード表現を選択する必要があります。最近の明らか/典型的な選択は、静的単一割り当て(SSA)です。 ただし、CのModern Compiler Implementationは、機能的な中間形式についても説明します。これは基本的に、中間表現の純粋な機能を実現することを意味します(ローカル変数のみについては純粋で、ヒープデータはCPSではなく、変更可能であり、単純なletブロックおよびテールコールのみです)。推論しやすいという点でいくつかの利点があります。 おそらくそれは簡単ではないか、誰もがすでにそのような表現を使用しているので、私の質問は、機能的な中間形式がSSAと比較してどのような不利な点ですか?

2
代数データ型の用途は何ですか?
私は代数データ型について読んでいます(Richard Minerichのおかげで、この概念のこの素晴らしい説明を見つけました)。私は和の種類や製品の種類などの概念を理解していると思いますが、パターンマッチングを指定する以外に、代数的データ型がどのように役立つかについてはあまり理解していません。パターンマッチングを超えたADTで他にできることは何ですか? 編集:私は開発者がオブジェクトで行うことができないADTで何ができるかを尋ねていません。ADTで許可されている他の操作があるかどうかを尋ねています。たとえば、ADTが採用されている場合、関係するタイプについて追加の推論を行うことができますか?ADTは、それなしでは不可能な、ある種の型分析を容易にしますか?

5
AndroidのDalvik VMにコンパイルされる関数型言語?[閉まっている]
閉じた。この質問はより集中する必要があります。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集するだけで1つの問題に焦点を当てるように質問を更新します。 4年前に閉鎖されました。 プログラミングへの機能的アプローチに適合するソフトウェアの問題がありますが、ターゲット市場はAndroid OSになります。JavaのVMにコンパイルされる関数型言語がありますが、Dalvikバイトコード!= Javaバイトコードがあるためです。 あるいは、dxユーティリティが.classScalaのような関数型言語から生成されたファイルをインテリジェントに変換できるかどうか知っていますか? 編集:コミュニティにもう少し役立つものを追加するために、また私がより良い選択をするために、質問を少し洗練させることができますか? Dalvikで他の言語を使用しましたか?どれ? 遭遇する可能性のある「落とし穴」(問題)とは何ですか? パフォーマンスは許容範囲ですか?つまり、アプリケーションは依然としてユーザーに反応していると感じています。 私は携帯電話の開発を行ったことはありませんが、制約のあるデバイスで育ち、プラットフォームで非標準言語を使用するのにコストがかかるという幻想はありません。コストがデフォルト言語へのアプローチを靴磨きする必要があるかどうかを知る必要があるだけです(つまり、OOP言語で機能原理を適用します)。

4
状態の変化に依存しない方が良いのはなぜですか?
この質問は、https://softwareengineering.stackexchange.com/questions/25569/is-haskell-worth-learningの質問から生じます。 一般に、Haskellが他の言語のコーディングスキルをどのように向上させるかについて、頻繁に繰り返されるステートメントがいくつか作成されます。さらに、これはHaskellがステートレスであるためであり、それは良いことです。 どうして? 誰かがこれを左手でタイプするだけ、あるいは一日目を閉じてタッチだけに頼るのと比較するのを見たことがあります。確かにそれ以上のものがありますか? ハードウェアのメモリアクセス、またはパフォーマンスの大幅な向上に関連する何かに関連していますか?

5
Elmの主張のように、「ランタイム例外なし」の利点は何ですか?
一部の言語では、「実行時例外がない」と主張している他の言語よりも明確な利点があります。 私はこの問題について混乱しています。 ランタイム例外は、私が知る限り単なるツールであり、適切に使用されている場合: 「ダーティ」状態を通信できます(予期しないデータでスロー) エラーの連鎖を指すことができるスタックを追加する 乱雑(無効な入力で空の値を返すなど)と開発者の注意が必要な安全でない使用(無効な入力で例外をスローするなど)を区別できます。 エラーに詳細を追加することができます。例外メッセージを使用して、デバッグ作業に役立つさらに詳細な情報を提供できます(理論的に) 一方、例外を「飲み込む」ソフトウェアをデバッグするのは本当に難しいと感じています。例えば try { myFailingCode(); } catch { // no logs, no crashes, just a dirty state } 質問は、「ランタイム例外なし」の強力で理論的な利点は何ですか? 例 https://guide.elm-lang.org/ 実際には実行時エラーはありません。ヌルなし。未定義は関数ではありません。

4
APIと関数型プログラミング
Clojureなどの関数型プログラミング言語への(明らかに限定された)経験から、データのカプセル化はそれほど重要ではないようです。通常、マップやセットなどのさまざまなネイティブタイプは、オブジェクトよりもデータを表すための優先通貨です。さらに、そのデータは一般に不変です。 たとえば、この件に関するインタビューで、Clojureの名声のRich Hickeyからの有名な引用の1つを次に示します。 Fogus:その考えに従うと、Clojureがそのタイプでデータ隠蔽のカプセル化を行わないという事実に驚く人もいます。なぜデータ隠蔽をやめることにしたのですか? ヒッキー:Clojureがプログラミングを抽象化に重点を置いていることを明確にしましょう。ただし、ある時点で、誰かがデータにアクセスする必要があります。また、「プライベート」という概念がある場合、それに対応する特権と信頼の概念が必要です。そして、それは非常に多くの複雑さと小さな価値を追加し、システムに硬直性をもたらし、しばしば物を本来あるべきでない場所に住まわせます。これは、単純な情報がクラスに入れられるときに発生する他の損失に追加されます。データが不変である限り、誰かが変更される可能性のあるものに依存するようになる可能性があることを除いて、アクセスを提供することによってもたらされる害はほとんどありません。まあ、大丈夫、人々は実際の生活の中で常にそうしていて、物事が変わると適応します。そして、それらが合理的であれば、彼らは、将来変化する可能性のある何かに基づいて決定を下すときを知っています。だから、それはリスク管理の決定であり、プログラマは自由にすべきだと思う。抽象化に向けてプログラミングを行い、実装の詳細と結婚することを警戒したいという感覚がなければ、優秀なプログラマーになることは決してありません。 オブジェクト指向の世界から来て、これは私が長年にわたって学んだ神聖な原則のいくつかを複雑にするようです。これらには、情報隠蔽、デメテルの法則、統一アクセス原則などが含まれます。カプセル化という一般的なスレッドにより、他の人が触れてはいけないことを知るためのAPIを定義できます。本質的に、一部のコードのメンテナーがコンシューマーのコードにバグを導入する可能性を心配することなく、自由に変更やリファクタリングを行えるようにするコントラクトを作成します(オープン/クローズ原則)。また、他のプログラマーがそのデータを取得または構築するために使用できるツールを知るための、クリーンで精選されたインターフェースを提供します。 データへの直接アクセスが許可されると、そのAPIコントラクトは壊れ、カプセル化の利点はすべてなくなるようです。また、厳密に不変のデータは、ドメイン固有の構造(オブジェクト、構造体、レコード)の受け渡しを、状態とその状態で実行できる一連のアクションを表すという意味であまり役に立たないようです。 APIを定義する必要があり、多くの開発者がシステムの特定の部分の操作に関与するなど、コードベースのサイズが巨大になったときに発生するように思われるこれらの問題に、機能コードベースはどのように対処しますか?これらのタイプのコードベースでこれがどのように処理されるかを示すこの状況の例はありますか?

9
高レベルの管理者に関数型プログラミングを考慮するよう説得するための良い事実上の議論は何でしょうか?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 5年前に閉鎖されました。 関数型プログラミングが良いアイデアである理由については、「理論的な」議論がたくさんあります(それが多すぎて未解決の問題として残っているので、正しくそうです)。 ただし、それらのほとんどは、理論(「エレガンス」など)から作成された議論、または開発者向けの議論です。 問題は、大企業の上級管理職にアイデアを提示することを目的とする場合、それらのほとんどはまったく役に立たないことです。一部の人は開発者でさえなく、全員が主にビジネス議論を重視します:コスト、人的資本管理、製品の配送、クライアントサービス、収益。事実に裏付けられない理論的ポイントに関する定量的事実も同様です。 Java / C ++ /(Perl | Python)などの手続き型/ OOPの典型的な組み合わせに対して、関数型プログラミングの概念(特定の言語ではない)の採用を検討する限り、これらのビジネス上の懸念に対処するために説得力のある議論はありますか。 できれば、定量的かつ/または研究や事例研究に基づいた議論を探しています。たとえば、「このリファレンスによると、Lisp / F#のマルチスレッドシステムのバグ率はJavaの10%です」または「トップ3の利益として機能プログラミングという名の望ましいテクノロジーの選好を表明する卒業生の80%」。 Grahamがスターアップの関数型プログラミングのユースケースを提示したことは知っていますが、大規模な既存の企業に有効であると仮定して、彼の議論の一部を受け入れます。 psPerlで関数型プログラミングに近いもの、おそらくPython、そして(おそらく)Java 8またはC ++ 14を実行できることを完全に認識しています。しかし、それはPerl、C ++またはJavaを使用する組織が関数型これらの言語でもOOP /手続き的アプローチ この言語の目的のために、「大」は、すべての開発者が使用/実行できるものを決定する専用の開発エンジニアリング/ツールグループを持つのに十分な大きさとして定義されます。そして、ローエンドで少なくとも数百人の開発者。

3
高階関数の命名規則?[閉まっている]
閉じた。この質問は意見に基づいています。現在、回答を受け付けていません。 この質問を改善したいですか?この投稿を編集して事実と引用で答えられるように質問を更新してください。 4年前に閉鎖されました。 高階関数の命名規則はありますか?つまり、他の関数を返す関数です。 JavaScriptの例: function onlyDivisibleBy(div) { // <-- higher order function return function (n) { return n % div === 0; } } var arr = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; arr.filter(onlyDivisibleBy(3)); // [0, 3, 6, 9] arr.filter(onlyDivisibleBy(5)); // [0, 5] 私はそれを上記のように書く傾向がありました:つまり、呼び出しポイントでの読みやすさの最適化(上記の最後の行を「配列をフィルターして5で割り切れる項目を取得する」と読みました)使用されているコンテキストから、この関数がその名前から何をするのかを理解するのはそれほど簡単ではありません。

2
手順として実装されていない継続の例は何ですか?
SOに関するコールバックと継続の区別に関する興味深い議論がこの質問を促しました。定義上、継続とは、計算を完了するために必要なロジックの抽象的な表現です。ほとんどの言語では、これは継続的な処理が必要な値を渡す1つの引数プロシージャとして現れます。 純粋に関数型の言語(すべての関数が純粋でファーストクラスの市民である場合)では、継続は関数として完全にモデル化できると思います。これは、結局のところ、これまでの継続を私が以前に理解していた方法です。ただし、世界は状態(ため息)でいっぱいです。したがって、一般的な定義では、継続がプログラムの状態をキャプチャする必要はありません。 私の理解を助けるために、継続が関数よりも抽象的な方法で表現されている関数型言語で例を提供できますか?Schemeを使用すると、現在の継続をファーストクラスの方法(call / cc)で取得できることはわかっていますが、それでも、call / ccに渡される1つの引数プロシージャには、現在の継続が別の形式で与えられているようですcall / cc'd関数が結果を適用できる引数手続き。

5
ラムダ計算におけるλx.λf.fx(逆適用のような)の名前は何ですか?対応する関数にはプログラミングの標準名がありますか?
ラムダ計算におけるλx.λf.fxの名前は何ですか? 対応する関数は、Haskellのような関数型プログラミング言語の標準名を持っていますか? オブジェクト指向プログラミングではfoo、引数として関数を受け取るメソッドに通常の名前がありx.foo(f)ますf(x)か?

5
インターフェイスに代わる機能プログラミングとは何ですか?
「機能的な」スタイルでプログラミングしたい場合、インターフェイスを何に置き換えますか? interface IFace { string Name { get; set; } int Id { get; } } class Foo : IFace { ... } たぶんTuple<>? Tuple<Func<string> /*get_Name*/, Action<String> /*set_Name*/, Func<int> /*get_Id*/> Foo; そもそもインターフェイスを使用している唯一の理由は、特定のプロパティ/メソッドを常に利用できるようにしたいからです。 編集:私が考えている/試みていることについてのいくつかの詳細。 たとえば、次の3つの関数を取るメソッドがあります。 static class Blarf { public static void DoSomething(Func<string> getName, Action<string> setName, Func<int> getId); } Bar私のインスタンスでこのメソッドを使用できます: class …

4
Groovyは部分的なアプリケーションを「カリー化」と呼びますか?
Groovyには、「カリー化」と呼ばれる概念があります。Wikiの例を次に示します。 def divide = { a, b -> a / b } def halver = divide.rcurry(2) assert halver(8) == 4 ここで何が起こっているかについての私の理解は、 divide値2にバインドされているということです。これは、部分的なアプリケーションの形式のようです。 通常、カリー化という用語は、一連の引数をとる関数を、1つの引数のみを取り、別の関数を返す関数に変換することを意味するために使用されます。たとえばcurry、Haskell の関数のタイプは次のとおりです。 curry :: ((a, b) -> c) -> (a -> (b -> c)) Haskellのを使用していない人のためにa、bそしてc、すべての一般的なパラメータです。 curryは、2つの引数を持つ関数を受け取りa、からbまでの関数を受け取って返す関数を返しますc。これを明確にするために、型に余分な括弧を追加しました。 グルーヴィーな例で何が起こっているのか誤解しているのですか、それとも単に部分的なアプリケーションの名前を間違っているのですか?または、実際には両方を行います。つまりdivide、カリー化された関数に変換し、2この新しい関数に部分的に適用します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.