問題タブ [scala-option]

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.

0 投票する
1 に答える
1302 参照

scala - Scala の Option フォールドはどのように異形性を持っているのでしょうか?

この質問に対する答えは、Scala の Option での fold メソッドがカタモフィズムであることを示唆しています。ウィキペディアによると、カタモフィズムは「初期代数から他の代数への固有の準同型写像です。この概念は、関数型プログラミングに折り畳みとして適用されています」。それは公平に思えますが、 F-algebrasのカテゴリの初期オブジェクトとしての初期代数に私を導きます。

したがって、Option の折り畳みが本当にカタモフィズムである場合、Option が最初のオブジェクトである F 代数の圏を作成するために、ファンクター F が必要です。このファンクターが何であるかわかりません。

タイプのリストの場合A、ファンクタFF[X] = 1 + A * Xです。List は再帰的なデータ型であるため、これは理にかなっています。したがって、上記の if Xis List[A]then は、型のリストがA空のリスト ( 1)、または ( ) anと a+のペア ( ) のいずれかであると読み取ります。しかし Option は再帰的ではありません。(Nothing または an )になります。したがって、ファンクターがどこにあるのかわかりません。*AList[A]Option[A]1 + AA

明確にするために、 Option は にかかるという点で既にファンクターであることを認識していますAOption[A]、リストに対して行われることは異なり、Aは修正され、データ型を再帰的に構築する方法を記述するためにファンクターが使用されます。

関連する注意事項として、カタモルフィズムでない場合は、おそらく混乱を招くため、襞と呼ぶべきではありません。

0 投票する
5 に答える
1213 参照

scala - 最初の None に到達したときに Option[Collection] の構築を停止するにはどうすればよいですか?

内でコレクションを構築する場合、コレクションOptionの次のメンバーを作成しようとするたびに失敗し、コレクション全体も失敗する可能性があります。Noneメンバーを作るのに最初に失敗したら、すぐにあきらめて、コレクション全体に戻りたいと思います。Scalaでこれを行う慣用的な方法は何ですか?

これが私が思いついた1つのアプローチです:

つまり、 return を呼び出すと、 return がfindPartByName返されます。それ以外の場合は、すべてが有効であることが保証されているのコレクションを含む を返します。空のコレクションは問題ありません。NoneallPartsNoneallPartsSomeParts

上記にはfindPartByName、最初の失敗の後に呼び出しを停止するという利点があります。ただしfoldLeft、関係なく、名前ごとに 1 回繰り返します。

findPartByNameを返すとすぐに救済するバージョンは次のNoneとおりです。

私は現在、2 番目のバージョンの方が読みやすいと感じていますが、(a) 最も読みやすいと思われるものは、Scala の経験を積むにつれて変わる可能性が高く、(b) Scala では早期returnは嫌われているという印象を受けます。(c) どちらもありません。何が起こっているのかを特に明白にしているようです。

「オール オア ナッシング」と「最初の失敗であきらめる」の組み合わせは、基本的なプログラミング概念のように思えます。それを表現するには、一般的な Scala または関数型イディオムが必要だと思います。

0 投票する
1 に答える
413 参照

scala - Scalaz .option - この省略形は何ですか?

次のコードが表示されます。

これは次と同等ですか:

Scalaz でこの.optionメソッドの doco を見つけるのに苦労しているので質問します。

0 投票する
9 に答える
2786 参照

scala - 2 つのオプションから 1 つのオプションを取得し、2 つが利用可能な場合は例外をスローするための慣用的な scala

私はどちらかのタイプを簡単に調べましたが、「2つの可能なタイプのうちの1つの値を表す」ためのようです。データ構造またはモナドが不足していますか? 基本的に、明示的 (および両方が価値がある場合はエラースロー) が必要です。利用可能な場合はどちらかを取得するか、None を取得します

0 投票する
2 に答える
154 参照

scala - Scala メソッド引数: コレクションまたはデフォルト値のオプション

[Int, MyClass] の Map を引数として取るメソッドがあります。このようなもの:

myMethod(someMap : Map[Int, MyClass])

ただし、someMap が常に存在するとは限りません (Java の世界では null であり、Scala では None です)。API の観点から、このメソッドのより適切な設計は次のうちどれですか。

  1. Option でラップする: myMethod(someMap : Option[Map[Int, MyClass]] = None)

  2. デフォルトの空のマップの定義: myMethod(someMap : Map[Int, MyClass] = Maps.empty)

最初のオプションはエレガントに見えますが、Map (None ではない場合) を Some() でラップする必要があり、実装者が getOrElse を実行してラップを解除する必要があるという複雑さが追加されています。最初のオプションは、マップ オブジェクトが実際には存在しない可能性があることを API のコンシューマーに明らかにします (なし)。

2 番目のオプションでは、ラップ (一部) またはアンラップを行う必要はありませんが、既存の Map オブジェクトが存在しないたびに空のコンテナーをインスタンス化する必要があります。

また、引数は 1 です。Option 自体が 0 または 1 アイテムのコンテナーであり、Map もコンテナー (コレクション) です。コンテナを別のコンテナで包むのは良いデザインですか?

API 設計の観点から、どちらがより良いアプローチですか?

0 投票する
2 に答える
280 参照

scala - Option.fold - 2 番目の引数が二項演算子でないのはなぜですか?

これには正当な理由があると確信していますが、私はそれを見ていません。

Foldオン(言う)Listリターン

opすべての要素の間に折り畳み演算子を適用した結果とz

and との明らかな関係がfoldLeftありfoldRightますが、同じことを行いますが、順序が定義されています (したがって、結合演算子は必要ありません)。

FoldOption返品について

が空でない場合、fthisの値に適用した結果を返します。それ以外の場合は、式を評価します。scala.Optionscala.OptionifEmpty

ifEmptyzリスト の (の位置にある)です。fは(の位置に)op

(値を含む場合と含まない場合がある「コンテナ」としてのNone私のメンタルモデルを使用すると、「空の」コンテナです)、問題はなく、ゼロ(の値)を返します。OptionOption.foldifEmpty

Some(x)ただし、 for は 2 つのパラメーターを取るべきではないためf、 on シーケンスzx一致します (および とfold同様の関係を持つことを含む)。foldLeftfoldRight

これには間違いなく実用的な議論があります -実際にはパラメータとしてf取るだけxの方がおそらく便利です。ほとんどの場合、それもかかっzた場合は無視されます。しかし、一貫性も重要です...

では、なぜfoldon Option がまだ「適切」なのか説明してもらえますfoldか?