問題タブ [scala-cats]
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 で Enums をタイプ セーフでコンパイラ チェックする方法
この問題に関してSOでいくつかの質問を見ましたが、それでも本当に良い答えを見つけることができませんでした:
、、State Enum
の 3 つの状態を持つ が必要です。Good
NotGood
Unknown
今まで、大したことはありません。しかし、状態は外部 API から取得されるため (文書化されていないため、Unknown
状態が理由です)、スネーク ケースを使用して取得されるため、findByName
変換を行います。
ここで、次の 2 つの問題があります。
1 つ目: 網羅的ではない一致についてコンパイラに警告してもらいたい。これは、封印された特性を使用して達成できます。これにより、2番目の問題が発生します
2番目:
Unknown
受け取った値を保存したいのですが、Enums
構造ではなく定義で名前を取得したい場合。しかし、封印された特性を持っている場合、このチュートリアルのように、そのようなシナリオをどのように定義できますか?
私は次のようなものを得ました:
それでも、unknown
ハードコードされているので、引数/コンストラクターのパラメーターにしたいと思います。
また、findByname
財産を失った...
「純粋な」Scalaを使用したソリューションを好みますが、ShapelessまたはCatsを使用したソリューションも見たいです
scala - Scalaは、scalazまたはcatsでNaturalTransformationをポンピングできません
何らかの理由で、以下が機能しません
test
自然な変換でメソッドを呼び出すとき。Intellij はそれを拡張関数として認識しますが、コンパイルではvalue test is not a member of cats.~>
. scalaz NaturalTransformation を使用する場合も同じことが起こります。コンパイルが拡張子を認識できるようにするためにできることはありますか?
Scala のバージョンは 2.11.8 です
失敗する例:
(上記はカインド プロジェクター プラグインを使用していますが、タイプ ラムダ、または単一パラメーターの上位のカインド タイプでも同様に失敗します)
haskell - リストのすべての要素を fmap でマップする必要があるのはなぜですか?
Learn you a Haskell For Great Good という本と、カテゴリ オブジェクトとプログラミング オブジェクトを混同するというよくあるカテゴリの誤りを克服するのに役立つ非常に役立つウィキ ブックの記事Haskell カテゴリ理論を読んだ後、私はまだ次の疑問を持っています。
fmap
リストのすべての要素をマップする必要があるのはなぜですか?
私はそれが好きです、これが理論的にどのように正当化されたカテゴリであるかを理解したいだけです. (または、HoTT を使用する方が簡単に正当化できるのでしょうか?)
Scala表記でList
は、任意の型を取り、それをすべてのリスト型のセットから型にマップするファンクタです。たとえば、型Int
を型List[Int]
にマップし、関数をInt
たとえば
Int.successor: Int => Int
にFunctor[List].fmap(successor) : List[Int] => List[Int]
Int.toString: Int => String
にFunctor[List].fmap(toString): List[Int] => List[String]
現在、 のすべてのインスタンスは、関数( Haskell の場合) と関数( Haskell の場合) をList[X]
持つモノイドです。私の推測では、リストがモノイドであるという事実を使用して、リストのすべての要素をマップする必要があることを示すことができます。ここで私が感じているのは、Applicative から関数を追加すると、他のタイプの要素が 1 つだけのリストが得られるということです。例えば。これらの要素では、次の要素を含むシングルトン リストが得られるため、これですべてのサブセットがカバーされます。次に、これらすべてのシングルトンの関数が、リストの他のすべての要素を提供すると思います。どういうわけか、それがマップの動作方法を制限していると思います。empty
mempty
combine
mappend
map
pure
Applicative[List[Int]].pure(1) == List(1)
map(succ)
combine
別の示唆的な議論は、map
リスト間で関数をマップする必要があるというものです。a のすべての要素はList[Int]
Int 型であるため、1 つを 1 つList[String]
にマップする場合、そのすべての要素をマップする必要があります。そうしないと、適切な型ではありません。
したがって、これらの議論はどちらも正しい方向を指しているように見えます。しかし、私は残りの道を得るために何が必要なのか疑問に思っていました.
反例?
これが反例写像関数ではないのはなぜですか?
ルールを守っているようです
ああ。しかし、それはid法に適合しません。
scala - Scala でアプリカティブ ファンクターをスタックする方法
アプリカティブ ファンクターは、計算ステップが独立している場合に、モナドの代替としてよく言及されます。F[G[X]]
よく言及される利点の 1 つは、常にアプリカティブでもあるため、アプリカティブをスタックする場合にトランスフォーマーが必要ないことです。次の機能があるとしましょう:
Future[Option[User]]
andを取得し、それFuture[Option[Data]]
を でマップするために、エレガントなスタッキングが必要process
です。
これまでのところ、私はこれを思いつきました(猫を使用):
しかし、それは理想にはほど遠いと確信しています。同じことを達成するためのよりエレガントで一般的な方法はありますか?
scala - Apply 型クラスと Applicative 型クラスを分離する必要があるのはなぜですか?
型クラスApply
とApplicative
. _ Applicative
ライブラリが、拡張Functor
して追加する1 つの型クラスではなく、2 つの別個の型クラスを提供するのはなぜでしょうap
か。Apply
ではないものを使っている人はいApplicative
ますか?
shapeless - Functor がパラメーター インスタンスの暗黙的な値を欠いている (sbt clean 後のみ)
Kittens ( https://github.com/milesabin/kittens ) でいくつかの実験を行ったところ、コードのコンパイルに問題がありました。次のエラーが表示されます。
完全なファイルは次のとおりです
問題なくコンパイルされる ScalaTest でほぼ同じコードを使用しました。
私のbuild.sbtは次のようになります name := "shapeless-experiments"
最も興味深いのは、インクリメンタル コンパイルの一部としてコンパイルされることです。
行番号 16、23、32 にコメントを付けてから「sbt compile」を実行し、コメントを削除して「sbt compile/package」を実行すると、コンパイルされ、プログラムを実行することさえできます。しかし、「sbt clean」を実行するとすぐにコンパイルされなくなります。
AdtDefns Object は基本的にhttps://github.com/milessabin/kittens/blob/master/core/src/test/scala/cats/derived/adtdefns.scala のコピーです 該当部分は
PS: 誰かが scala-kittens のタグを作成できるといいですね
scala - オブジェクト機能インピーダンスのミスマッチ
OOP では、実装ではなくインターフェイスと対話することをお勧めします。したがって、たとえば、次のように記述します (つまりSeq
:) scala.collection.immutable.Seq
):
次のようなものではありません。
ただし、Haskell などの純粋な関数型プログラミング言語では、サブタイプ ポリモーフィズムはなく、代わりに型クラスによるアドホック ポリモーフィズムを使用します。したがって、たとえば、list データ型と list のモナド インスタンスがあります。そのような概念がないため、インターフェイス/抽象クラスの使用について心配する必要はありません。
Scala などのハイブリッド言語では、型クラス (実際にはパターンを介して、Haskell のようなファーストクラスの市民ではありませんが、余談ですが) とサブタイプのポリモーフィズムの両方があります。scalaz
などではcats
、もちろん、抽象型ではなく、具象型のモナド インスタンスがあります。
最後に質問: Scala のこのハイブリッド性を考慮して、インターフェイスと対話するための OOP 規則を引き続き尊重しますか、それとも、使用する必要があるたびに具象型に変換する必要なく、ファンクターやモナドなどを直接利用するために具象型と対話しますか?彼ら?別の言い方をすれば、OOP の代わりに FP を採用したい場合でも、インターフェースと対話することは Scala でまだ良い習慣ですか? そうでない場合は、使用することを選択し、後でa の方が適切な選択List
であることに気付いたとしたらどうしますか?Vector
PS: 私の例では単純な方法を使用しましたが、同じ理由がユーザー定義型にも当てはまります。例えば: