問題タブ [monads]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - ? のような Java での Null Safe 逆参照。Maybeモナドを使ってGroovyで
Objective C から Java に移植されたコードベースに取り組んでいます。nullcheck を使用しないメソッド チェーンの使用法がいくつかあります。
安全な逆参照演算子?に似たものを探していました。nullchecks の代わりに Groovy で
これにより、Maybe モナドは Null の代わりに Nothing の概念を持つようになりました。しかし、値がアクセスされたときに、私が遭遇した Nothing のすべての実装は例外をスローしますが、それでもチェーンの問題は解決されません。NullObject パターンのように動作するモックを返す Nothing を作成しました。しかし、それはチェーンの問題を解決します。
この Nothing の実装に問題はありますか?
私が見る限り
- コードでモッキングライブラリを使用するのは奇妙に感じます
- 最初のヌルで止まらない。
- null参照または名前が実際にnullであるため、null結果を区別するにはどうすればよいですか? Groovy コードではどのように区別されますか?
haskell - 珍しい型の署名
自然言語セマンティクスのモナドでは、Chung-Chieh Shanが、モナドを使用して、いくつかの異なる種類の自然言語現象(疑問詞、焦点、内包性、および数量化)の標準的な説明をうまく均一に言い換えることができる方法を示しています。彼は、この目的に役立つ2つの合成操作とを定義しA_Mています。A'_M
1つ目は単純apです。べき集合のモナドapには、非決定論的関数アプリケーションがあります。これは、疑問詞のセマンティクスを処理するのに役立ちます。リーダーモナドでは、拡張構成の通常の分析に対応します。等
意味あり。ただし、2次合成操作には、私には奇妙に見える型注釈があります。
(Shanはそれを呼んでA'_Mいますが、ここでは呼んでい<?>ます。)定義は、型に期待するものです。それはかなり密接に対応していapます:
これが論文の文脈でどのように想定されているかを理解できると思います(疑問詞の質問動詞の処理、内包と外延の役割など)。それが行うことはそれほど複雑ではありませんが、それが以前にHaskellで見たイディオムではないので、ここでそのような中心的な役割を果たすのを見るのは少し奇妙です。
Hoogleでは、m (m a -> b) -> m a -> m bまたはのどちらにも役立つものはありませんm (a -> b) -> a -> m b。
これは他のコンテキストの人にはなじみがありますか?この関数を書いたことがありますか?
c# - IEnumerable 以外の型 (モナド?) を操作する LINQ クエリ式-- 用途は?
私はTomas Petricek と Jon Skeet によるReal-world Functional Programmingという本を読んでいますが、計算式1) (別名モナド) のセクションを理解するのに苦労しています。
この本を通じて、以前の経験とは対照的に、LINQ クエリ式は に限定されずIEnumerable<T>、他のカスタム型でも機能することを学びました。これは私にとって非常に興味深いことであり、クエリ式の構文 ( from x in ... select ...) が適しているシナリオがあるかどうか疑問に思っています。
背景情報:
どうやら、そのようなカスタム型は計算型と呼ばれ、Haskellのモナドと本質的に同じものとして描かれています。私はモナドが何であるかを正確に把握することはできませんでしたが、本によると、それらはbindとreturnと呼ばれる 2 つの操作によって定義されます。
関数型プログラミングでは、これら 2 つの操作の型シグネチャは次のようになります (私が思うに):
はMモナド型の名前です。
C# では、これは次のようになります。
LINQ Enumerable.Select(射影演算子) は、バインド操作とまったく同じシグネチャを持っていることがわかりM := IEnumerableます。
私のカスタム LINQ 計算タイプ:
この知識を使用して、次のようなカスタム計算タイプを記述できるようになりました IEnumerable。
Wrapped<T>これで、LINQ クエリ式で使用できるようになりました。たとえば、次のようになります。
もちろん、この例はあまり役に立ちませんが、クエリ式を作成して、コレクションを操作する以外のことを行う方法を示しています。たとえば、値を何らかの型でラップおよびラップ解除するなどです。
質問:
上記の計算タイプはあまり役に立たないようです。したがって、LINQ クエリ式を利用する (コレクションの処理以外に) 他にどのような合理的な用途があるのでしょうか?
1)セクション 12.4:「代替ワークフローの紹介」、334 ページから。
haskell - モナドを返す Haskell マップ
Data.Map および Data.IntMap のルックアップ関数は現在、型シグネチャを使用して Maybe でラップされた値を返します。
以前は、より一般的なタイプの
前者は余分な型指定の必要性を減らす可能性が高いと思いますが、後者はより一般的になり、リスト内包表記でルックアップを使用できるようになります。新しいバージョンでこの動作を模倣する方法はありますか、または古いバージョンのライブラリを使用する必要がありますか?
haskell - STMモナド問題
これは、私の質問を説明するための単なる架空のシナリオです。2つのスレッドと1つのTVarがそれらの間で共有されていると仮定します。1つのスレッドには、TVarを読み取り、完了するのに10秒かかるアトミックブロックがあります。別のスレッドには、TVarを毎秒変更するアトミックブロックがあります。最初のアトミックブロックはこれまでに完了しますか?ログが永続的に一貫性のない状態にあるので、確かにそれは最初に戻り続けるでしょう?
function - HaskellIOが別の関数にパスする
ここでのこの質問は、 Haskell入力リターンタプルに関連しています
計算を行うために、モナドIOからの入力を別の関数に渡すにはどうすればよいのでしょうか。
実は私が欲しいのは
2番目の例では、maxinvestinputがファイルから読み取られ、データが期待されるタイプmaximuminvestに変換されます。助けてください。
ありがとう。
haskell - Haskellの大規模なデザイン?
特にHaskellで大規模な機能プログラムを設計/構造化するための良い方法は何ですか?
私はたくさんのチュートリアルを経験しました(自分でスキームを書くのが私のお気に入りで、Real World Haskellがすぐ近くにあります)-しかし、ほとんどのプログラムは比較的小さく、単一目的です。さらに、それらのいくつかは特にエレガントであるとは考えていません(たとえば、WYASの膨大なルックアップテーブル)。
さまざまなソースからデータを取得し、クリーニングし、さまざまな方法で処理し、ユーザーインターフェイスに表示し、永続化し、ネットワークを介して通信するなど、より多くの可動部分を備えた、より大きなプログラムを作成したいと考えています。そのようなコードを読みやすく、保守しやすく、変化する要件に適応できるようにするための最良の構造はどれですか?
大規模なオブジェクト指向の命令型プログラムに関するこれらの質問に対処する非常に多くの文献があります。MVC、デザインパターンなどのアイデアは、関心の分離やオブジェクト指向スタイルでの再利用性などの幅広い目標を実現するための適切な処方箋です。さらに、新しい命令型言語は、「成長するにつれて設計する」スタイルのリファクタリングに役立ちます。私の初心者の意見では、Haskellはあまり適していません。
Haskellに相当する文献はありますか?関数型プログラミング(モナド、矢印、アプリケーションなど)で利用できるエキゾチックな制御構造の動物園は、この目的にどのように最適に使用されますか?どのようなベストプラクティスをお勧めしますか?
ありがとう!
編集(これはドン・スチュワートの答えのフォローアップです):
@donsは次のように述べています。「モナドは主要な建築設計をタイプで捉えています。」
私の質問は、純粋な関数型言語での主要な建築設計についてどのように考えるべきかということだと思います。
いくつかのデータストリームといくつかの処理ステップの例を考えてみましょう。データストリームのモジュラーパーサーを一連のデータ構造に記述でき、各処理ステップを純粋関数として実装できます。1つのデータに必要な処理ステップは、その値と他のデータによって異なります。一部の手順の後には、GUIの更新やデータベースクエリなどの副作用が続く必要があります。
データと解析ステップを適切に結び付ける「正しい」方法は何ですか?さまざまなデータ型に対して正しいことを行う大きな関数を書くことができます。または、モナドを使用してこれまでに処理されたものを追跡し、各処理ステップでモナドの状態から次に必要なものを取得することもできます。または、大部分が別々のプログラムを作成してメッセージを送信することもできます(このオプションはあまり好きではありません)。
彼がリンクしたスライドには、「デザインをタイプ/関数/クラス/モナドにマッピングするためのイディオム」という箇条書きがあります。イディオムは何ですか?:)
monads - RWHのRandomStateの例にShowインスタンスを追加する
実世界のhaskellからのRandomStateの例を入力しました。次のようになります。
動作しますが、結果は表示されません。エラーメッセージが表示されます:
ShowRandomStateのインスタンスを追加するのに問題があります。誰かがこれがどのように行われるかを私に見せてもらえますか?
ありがとう。
haskell - Haskellは本当に純粋ですか(システム外の入出力を扱う言語はありますか)?
関数型プログラミングに関してモナドに触れた後、この機能は実際に言語を純粋にしますか、それとも黒板の数学以外の現実世界のコンピューターシステムを推論するための単なる「脱獄カード」ですか?
編集:
これは誰かがこの投稿で言ったような炎の餌ではありませんが、誰かが私を撃墜して、証拠と言うことができることを私が望んでいる本物の質問です、それは純粋です。
また、他のそれほど純粋ではない関数型言語や、優れた設計を使用するいくつかのオブジェクト指向言語に関する質問を検討し、純粋性を比較しています。これまでのところ、私の非常に限られたFPの世界では、モナドの純度をまだ高めていません。しかし、純度の問題ではるかに重要な不変性のアイデアが好きです。
map - map と mapM の動作
Real World Haskell の I/O の章に参加しています。モナドは、本書のさらに 7 つの章で議論されていません。つまり、私の I/O の理解はせいぜい不完全です。
今、私は mapM 関数を理解しようとしています。私が理解しているように、関数はリスト内の各要素を「実行」しますが、これは「アクション」(IOモナド)でなければなりません。
意味をなさないのは、この例です。同じ引数に対して mapM が map とは異なる結果を返すのはなぜですか?