問題タブ [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.

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

scala - Scala で Enums をタイプ セーフでコンパイラ チェックする方法

この問題に関してSOでいくつかの質問を見ましたが、それでも本当に良い答えを見つけることができませんでした:

、、State Enumの 3 つの状態を持つ が必要です。GoodNotGoodUnknown

今まで、大したことはありません。しかし、状態は外部 API から取得されるため (文書化されていないため、Unknown状態が理由です)、スネーク ケースを使用して取得されるため、findByName変換を行います。

ここで、次の 2 つの問題があります。

  • 1 つ目: 網羅的ではない一致についてコンパイラに警告してもらいたい。これは、封印された特性を使用して達成できます。これにより、2番目の問題が発生します

  • 2番目:Unknown受け取った値を保存したいのですが、Enums構造ではなく定義で名前を取得したい場合。しかし、封印された特性を持っている場合、このチュートリアルのように、そのようなシナリオをどのように定義できますか?

私は次のようなものを得ました:

それでも、unknownハードコードされているので、引数/コンストラクターのパラメーターにしたいと思います。

また、findByname財産を失った...

「純粋な」Scalaを使用したソリューションを好みますが、ShapelessまたはCatsを使用したソリューションも見たいです

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

scala - Scalaは、scalazまたはcatsでNaturalTransformationをポンピングできません

何らかの理由で、以下が機能しません

test自然な変換でメソッドを呼び出すとき。Intellij はそれを拡張関数として認識しますが、コンパイルではvalue test is not a member of cats.~>. scalaz NaturalTransformation を使用する場合も同じことが起こります。コンパイルが拡張子を認識できるようにするためにできることはありますか?

Scala のバージョンは 2.11.8 です

失敗する例:

(上記はカインド プロジェクター プラグインを使用していますが、タイプ ラムダ、または単一パラメーターの上位のカインド タイプでも同様に失敗します)

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

haskell - リストのすべての要素を fmap でマップする必要があるのはなぜですか?

Learn you a Haskell For Great Good という本と、カテゴリ オブジェクトとプログラミング オブジェクトを混同するというよくあるカテゴリの誤りを克服するのに役立つ非常に役立つウィキ ブックの記事Haskell カテゴリ理論を読んだ後、私はまだ次の疑問を持っています。

fmapリストのすべての要素をマップする必要があるのはなぜですか?

私はそれが好きです、これが理論的にどのように正当化されたカテゴリであるかを理解したいだけです. (または、HoTT を使用する方が簡単に正当化できるのでしょうか?)

Scala表記でListは、任意の型を取り、それをすべてのリスト型のセットから型にマップするファンクタです。たとえば、型Intを型List[Int]にマップし、関数をIntたとえば

  • Int.successor: Int => IntFunctor[List].fmap(successor) : List[Int] => List[Int]
  • Int.toString: Int => StringFunctor[List].fmap(toString): List[Int] => List[String]

現在、 のすべてのインスタンスは、関数( Haskell の場合) と関数( Haskell の場合) をList[X]持つモノイドです。私の推測では、リストがモノイドであるという事実を使用して、リストのすべての要素をマップする必要があることを示すことができます。ここで私が感じているのは、Applicative から関数を追加すると、他のタイプの要素が 1 つだけのリストが得られるということです。例えば。これらの要素では、次の要素を含むシングルトン リストが得られるため、これですべてのサブセットがカバーされます。次に、これらすべてのシングルトンの関数が、リストの他のすべての要素を提供すると思います。どういうわけか、それがマップの動作方法を制限していると思います。emptymemptycombinemappendmappureApplicative[List[Int]].pure(1) == List(1)map(succ)combine

別の示唆的な議論は、mapリスト間で関数をマップする必要があるというものです。a のすべての要素はList[Int]Int 型であるため、1 つを 1 つList[String]にマップする場合、そのすべての要素をマップする必要があります。そうしないと、適切な型ではありません。

したがって、これらの議論はどちらも正しい方向を指しているように見えます。しかし、私は残りの道を得るために何が必要なのか疑問に思っていました.

反例?

これが反例写像関数ではないのはなぜですか?

ルールを守っているようです

ああ。しかし、それはid法に適合しません。

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

scala - Scala でアプリカティブ ファンクターをスタックする方法

アプリカティブ ファンクターは、計算ステップが独立している場合に、モナドの代替としてよく言及されます。F[G[X]]よく言及される利点の 1 つは、常にアプリカティブでもあるため、アプリカティブをスタックする場合にトランスフォーマーが必要ないことです。次の機能があるとしましょう:

Future[Option[User]]andを取得し、それFuture[Option[Data]]を でマップするために、エレガントなスタッキングが必要processです。

これまでのところ、私はこれを思いつきました(猫を使用):

しかし、それは理想にはほど遠いと確信しています。同じことを達成するためのよりエレガントで一般的な方法はありますか?

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

scala - Apply 型クラスと Applicative 型クラスを分離する必要があるのはなぜですか?

クラスApplyApplicative. _ Applicativeライブラリが、拡張Functorして追加する1 つの型クラスではなく、2 つの別個の型クラスを提供するのはなぜでしょうapか。Applyではないものを使っている人はいApplicativeますか?

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

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 のタグを作成できるといいですね

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

scala - オブジェクト機能インピーダンスのミスマッチ

OOP では、実装ではなくインターフェイスと対話することをお勧めします。したがって、たとえば、次のように記述します (つまりSeq:) scala.collection.immutable.Seq):

次のようなものではありません。

ただし、Haskell などの純粋な関数型プログラミング言語では、サブタイプ ポリモーフィズムはなく、代わりに型クラスによるアドホック ポリモーフィズムを使用します。したがって、たとえば、list データ型と list のモナド インスタンスがあります。そのような概念がないため、インターフェイス/抽象クラスの使用について心配する必要はありません。

Scala などのハイブリッド言語では、型クラス (実際にはパターンを介して、Haskell のようなファーストクラスの市民ではありませんが、余談ですが) とサブタイプのポリモーフィズムの両方があります。scalazなどではcats、もちろん、抽象型ではなく、具象型のモナド インスタンスがあります。

最後に質問: Scala のこのハイブリッド性を考慮して、インターフェイスと対話するための OOP 規則を引き続き尊重しますか、それとも、使用する必要があるたびに具象型に変換する必要なく、ファンクターやモナドなどを直接利用するために具象型と対話しますか?彼ら?別の言い方をすれば、OOP の代わりに FP を採用したい場合でも、インターフェースと対話することは Scala でまだ良い習慣ですか? そうでない場合は、使用することを選択し、後でa の方が適切な選択Listであることに気付いたとしたらどうしますか?Vector

PS: 私の例では単純な方法を使用しましたが、同じ理由がユーザー定義型にも当てはまります。例えば: