Where communities thrive


  • Join over 1.5M+ people
  • Join over 100K+ communities
  • Free without limits
  • Create your own community
People
Activity
    Naoki Aoyama
    @aoiroaoino
    あー、Monocle の gitter に書いてあった... 。argonautとの兼ね合いですね
    kenji yoshida
    @xuwei-k
    まだ7.3のfinalすぐ出す予定ないし、バイナリ互換的に普通に7.2.x使うべきだと思うけど、なんか話がよくわからない・・・。というかこれもあっさりmergeし過ぎでは・・・ julien-truffaut/Monocle#362
    argonautとの関係も、依存が逆ならともかく、あわせるって何か違う気がする・・・
    argonautがmonocleのSNAPSHOTに依存してたのもよくわからないので、この前さりげなく(?)戻すなどした argonaut-io/argonaut@e6c2f16
    Naoki Aoyama
    @aoiroaoino
    うぅm、正直マージしてからもう少し慎重に進めても良かったかなっては思ってました。反省。
    argonaut が monocle の SNAPSHOT に依存してた件、1.2.1 がリリースされる前に入った Plated あたりを使いたかったが故だった記憶があります。
    Naoki Aoyama
    @aoiroaoino
    (ぐぬぬ、完全にコミュニケーション不足な気がしてきたぞっ.....
    kenji yoshida
    @xuwei-k
    頑張ってください(他人任せ)
    pocketberserker
    @pocketberserker
    たいへんそう
    Naoki Aoyama
    @aoiroaoino
    実際、最近version管理滞ってる感してきてるしその辺すっきりさせた方が良さそう...
    頑張ります...
    taku0
    @taku0
    Functionalではないのでここで良いのかわかりませんが、“illegal cyclic reference involving trait E”とか“class graph is not finitary because type parameter T is expansively recursive”とかのエラーメッセージについてなにかご存知でしょうか。
    Java Generics are Turing Completeという論文( https://arxiv.org/abs/1605.05274 )があって、その中のコンパイルが止まらない型の例を単純化してJavaとScalaで書いてみました。そうしたところ、use-site varianceを使うと前者のエラーが出て、declaration-site varianceを使うと後者のエラーが出ました。
    https://gist.github.com/taku0/4335f65eb20a54fb965fff58fd582878
    Kota Mizushima
    @kmizu
    実は自分も、use-site varianceの例、Kotlinで書いてみようとしたのですが
    error: this type parameter violates the Non-Expansive Inheritance Restriction
    interface E<T> : N<N<in E<in T>>>
                ^
    こういう型エラーになります
    Non-Expansive Inheritance Restrictionという語感からは、なんか型のサイズが膨らむような継承は許さないという制限っぽい感じがしますが
    Kota Mizushima
    @kmizu
    class graph is not finitary because type parameter T is expansively recursive”
    どうも、似たようなメッセージですね…
    illegal cyclic reference involving trait Eは
    なんか、EがE自身を継承しているかのように見えているっぽいエラーですね…
    Kota Mizushima
    @kmizu
    実は、Java Genericsで例のコードが許されるのが逆に特殊なのではないかという気がしています…。
    interface E<T> : N<N<in E<in T>>>
    これは、E<T> : N< ... > を解決するには、E<in T>を具体化する必要があって、E<in T>を具体化するには、さらに、E<T>を具体化する必要があって…という感じになるのが、許されない、といった感じのような。
    というか、これはKotlinの話なので、ちょっとスレ違いですね。
    ただ、なんかKotlinもScalaも似たような制限を設けているような印象を受けます。
    Kota Mizushima
    @kmizu
    class graph is not finitary because type parameter T is expansively recursive
    これについては、
    stackoverflowに同様の質問がありました
    Java Generics are Turing Completeからも参照されている
    On Decidability of Nominal Subtyping with Variance
    Kota Mizushima
    @kmizu
    SLSにちょうどそのものずばりの記述があるのを見つけました
    It is a static error if the inheritance closure of a class type consists of an infinite number of types. (This restriction is necessary to make subtyping decidable1).
    どうも、Scala Genericsと(Kotlinも?)はKennedyとPierceの、サブタイピングを決定可能にするためのチェックを実装していて
    Java Genericsはそれを実装していない、という話になる気がしてきました。
    Kota Mizushima
    @kmizu
    Kennedy and Pierceの07の論文は以前斜め読みしただけなので、何故これでいいのかはまだよくわかっていません…
    Kota Mizushima
    @kmizu
    なんか調べながら継ぎ足して書いていったので全然まとまりがないですが、参考になれば。
    taku0
    @taku0

    Scalaのドキュメントを見ると、
    trait A[T] extends B[... A[T] ...]はOKで、
    trait A[T] extends B[... A[Seq[Int]] ...]もOKで、
    trait A[T] extends B[... A[C[T]] ...]はダメということのようですね。
    ありがとうございます。

    なお、trait E[-T] extends N[N[E[_ >: T]]]とするとエラーも出ずにstack overflowになりました。
    https://gist.github.com/taku0/4335f65eb20a54fb965fff58fd582878#file-loop3-scala
    想定していない動作のような気もします。

    もし finitaryの制約が既存のJavaコードに悪影響を与えない(か十分小さい)のであれば、将来のJavaに入るかもしれませんね。
    Kota Mizushima
    @kmizu
    想定していない動作のような気もします。
    これは想定外動作の可能性が高いような…?
    suish
    @y0ke

    某社のFizzBuzz 30byte以内なんて話を今更見つけてScala(cats/scalaz)でどこまで短く書けるかやっているのですが

      def a(i:Int)=1 to i map(x((x%3)0 option "Fizz")|+|((x%5)0 option "Buzz")|x+"")
      def b(i:Int)=1 to i map(x⇒(((x%3)≟0 option "Fizz")⊹((x%5)≟0 option "Buzz"))|x+"")

    から縮まりません。catsはどうしてもscalazより長くなるようでscalazで書いていますがロジックの変更含めてどこか改善の余地はあったりしますでしょうか?

    harry
    @harry0000
    コードゴルフはまったくのド素人なのですが、引数部分の書き方を変えると3文字減りました?
      def a=1 to(_:Int)map(x((x%3)0 option "Fizz")|+|((x%5)0 option "Buzz")|x+"")
      def b=1 to(_:Int)map(x⇒(((x%3)≟0 option "Fizz")⊹((x%5)≟0 option "Buzz"))|x+"")
    harry
    @harry0000
    先ほど気づいた ) の後ならスペースもドットも不要、というのを使うと 0≟(x%3)option と書けて更に2文字
      def a=1 to(_:Int)map(x(0(x%3)option "Fizz")|+|(0(x%5)option "Buzz")|x+"")
      def b=1 to(_:Int)map(x⇒((0≟(x%3)option "Fizz")⊹(0≟(x%5)option "Buzz"))|x+"")
    suish
    @y0ke
    @harry0000 ありがとうございます。部分適用と(x%3)の括弧を利用してスペースの省略は完全に盲点でした。
    Kazunari Mori
    @kazzna
    scalazのscalaz.syntax.stdにあるEitherOps#disjunctionをさらっと使いたい場合の、最小のimportってどんな感じですか?
    また、そのあたりのルールが記載してあるドキュメントがあったりすれば、教えてほしいです。
    KAWACHI Takashi
    @tkawachi
    文字数的に最小なら import scalaz._, Scalaz._ だろうけどそういう話ではないですよね ^^;
    import scalaz.syntax.either._ のほうが短かかった
    KAWACHI Takashi
    @tkawachi
    あ、 import scalaz.syntax.std.either._ のほうですね…

    ドキュメントはどこかにあるのでしょうか? https://github.com/scalaz/scalaz#at-a-glance

    Use of implicit views to provide access to Scalaz functionality as extension methods has been been segregated to scalaz.syntax, and can be imported selectively, and need not be used at all.

    とはあります。