問題タブ [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.
scala - Scala の Option フォールドはどのように異形性を持っているのでしょうか?
この質問に対する答えは、Scala の Option での fold メソッドがカタモフィズムであることを示唆しています。ウィキペディアによると、カタモフィズムは「初期代数から他の代数への固有の準同型写像です。この概念は、関数型プログラミングに折り畳みとして適用されています」。それは公平に思えますが、 F-algebrasのカテゴリの初期オブジェクトとしての初期代数に私を導きます。
したがって、Option の折り畳みが本当にカタモフィズムである場合、Option が最初のオブジェクトである F 代数の圏を作成するために、ファンクター F が必要です。このファンクターが何であるかわかりません。
タイプのリストの場合A
、ファンクタF
はF[X] = 1 + A * X
です。List は再帰的なデータ型であるため、これは理にかなっています。したがって、上記の if X
is List[A]
then は、型のリストがA
空のリスト ( 1
)、または ( ) anと a+
のペア ( ) のいずれかであると読み取ります。しかし Option は再帰的ではありません。(Nothing または an )になります。したがって、ファンクターがどこにあるのかわかりません。*
A
List[A]
Option[A]
1 + A
A
明確にするために、 Option は にかかるという点で既にファンクターであることを認識していますA
がOption[A]
、リストに対して行われることは異なり、A
は修正され、データ型を再帰的に構築する方法を記述するためにファンクターが使用されます。
関連する注意事項として、カタモルフィズムでない場合は、おそらく混乱を招くため、襞と呼ぶべきではありません。
scala - 最初の None に到達したときに Option[Collection] の構築を停止するにはどうすればよいですか?
内でコレクションを構築する場合、コレクションOption
の次のメンバーを作成しようとするたびに失敗し、コレクション全体も失敗する可能性があります。None
メンバーを作るのに最初に失敗したら、すぐにあきらめて、コレクション全体に戻りたいと思います。Scalaでこれを行う慣用的な方法は何ですか?
これが私が思いついた1つのアプローチです:
つまり、 return を呼び出すと、 return がfindPartByName
返されます。それ以外の場合は、すべてが有効であることが保証されているのコレクションを含む を返します。空のコレクションは問題ありません。None
allParts
None
allParts
Some
Parts
上記にはfindPartByName
、最初の失敗の後に呼び出しを停止するという利点があります。ただしfoldLeft
、関係なく、名前ごとに 1 回繰り返します。
findPartByName
を返すとすぐに救済するバージョンは次のNone
とおりです。
私は現在、2 番目のバージョンの方が読みやすいと感じていますが、(a) 最も読みやすいと思われるものは、Scala の経験を積むにつれて変わる可能性が高く、(b) Scala では早期return
は嫌われているという印象を受けます。(c) どちらもありません。何が起こっているのかを特に明白にしているようです。
「オール オア ナッシング」と「最初の失敗であきらめる」の組み合わせは、基本的なプログラミング概念のように思えます。それを表現するには、一般的な Scala または関数型イディオムが必要だと思います。
scala - Scalaz .option - この省略形は何ですか?
次のコードが表示されます。
これは次と同等ですか:
Scalaz でこの.option
メソッドの doco を見つけるのに苦労しているので質問します。
scala - 2 つのオプションから 1 つのオプションを取得し、2 つが利用可能な場合は例外をスローするための慣用的な scala
私はどちらかのタイプを簡単に調べましたが、「2つの可能なタイプのうちの1つの値を表す」ためのようです。データ構造またはモナドが不足していますか? 基本的に、明示的 (および両方が価値がある場合はエラースロー) が必要です。利用可能な場合はどちらかを取得するか、None を取得します
scala - Scala メソッド引数: コレクションまたはデフォルト値のオプション
[Int, MyClass] の Map を引数として取るメソッドがあります。このようなもの:
myMethod(someMap : Map[Int, MyClass])
ただし、someMap が常に存在するとは限りません (Java の世界では null であり、Scala では None です)。API の観点から、このメソッドのより適切な設計は次のうちどれですか。
Option でラップする: myMethod(someMap : Option[Map[Int, MyClass]] = None)
デフォルトの空のマップの定義: myMethod(someMap : Map[Int, MyClass] = Maps.empty)
最初のオプションはエレガントに見えますが、Map (None ではない場合) を Some() でラップする必要があり、実装者が getOrElse を実行してラップを解除する必要があるという複雑さが追加されています。最初のオプションは、マップ オブジェクトが実際には存在しない可能性があることを API のコンシューマーに明らかにします (なし)。
2 番目のオプションでは、ラップ (一部) またはアンラップを行う必要はありませんが、既存の Map オブジェクトが存在しないたびに空のコンテナーをインスタンス化する必要があります。
また、引数は 1 です。Option 自体が 0 または 1 アイテムのコンテナーであり、Map もコンテナー (コレクション) です。コンテナを別のコンテナで包むのは良いデザインですか?
API 設計の観点から、どちらがより良いアプローチですか?
scala - Option.fold - 2 番目の引数が二項演算子でないのはなぜですか?
これには正当な理由があると確信していますが、私はそれを見ていません。
Fold
オン(言う)List
リターン
op
すべての要素の間に折り畳み演算子を適用した結果とz
and との明らかな関係がfoldLeft
ありfoldRight
ますが、同じことを行いますが、順序が定義されています (したがって、結合演算子は必要ありません)。
Fold
Option
返品について
が空でない場合、
f
thisの値に適用した結果を返します。それ以外の場合は、式を評価します。scala.Option
scala.Option
ifEmpty
ifEmpty
z
リスト の (の位置にある)です。f
は(の位置に)op
(値を含む場合と含まない場合がある「コンテナ」としてのNone
私のメンタルモデルを使用すると、「空の」コンテナです)、問題はなく、ゼロ(の値)を返します。Option
Option.fold
ifEmpty
Some(x)
ただし、 for は 2 つのパラメーターを取るべきではないためf
、 on シーケンスz
とx
一致します (および とfold
同様の関係を持つことを含む)。foldLeft
foldRight
これには間違いなく実用的な議論があります -実際にはパラメータとしてf
取るだけx
の方がおそらく便利です。ほとんどの場合、それもかかっz
た場合は無視されます。しかし、一貫性も重要です...
では、なぜfold
on Option がまだ「適切」なのか説明してもらえますfold
か?