These are chat archives for typelevel/cats

19th
Dec 2017
Kai(luo) Wang
@kailuowang
Dec 19 2017 02:02
@/all 1.0.0-RC2 is on its way to Maven Central.
Cory Parent
@goedelsoup
Dec 19 2017 02:02
:clap:
Kai(luo) Wang
@kailuowang
Dec 19 2017 02:02
please help test. This is the final RC. 1.0 is scheduled 7 days from now.
Christopher Davenport
@ChristopherDavenport
Dec 19 2017 02:02
:tada:
andy scott
@andyscott
Dec 19 2017 02:04
w00t!
Ross A. Baker
@rossabaker
Dec 19 2017 05:03

1.0 is scheduled 7 days from now.

Does this mean a Christmas Day release?

Otto Chrons
@ochrons
Dec 19 2017 06:29
To celebrate Isaac Newton's birthday! 😀
Miles Sabin
@milessabin
Dec 19 2017 06:39
@kailuowang has RC2 been announced anywhere?
igor mazor
@mazorigal
Dec 19 2017 12:01
Hi, I have a function which return EitherT, where T = Future
I would like to use scala-metrics to measure the function time execution,
however cannot use timeFuture which comes with scala-metrcis since it expects Future
does my only option is to use EitherT.value and then convert it back to EitherT ?
Rafał Krzewski
@rkrzewski
Dec 19 2017 12:27
@mazorigal yeah I think you need to do that this way. Of course you can define you own utility function to do that and reuse it
igor mazor
@mazorigal
Dec 19 2017 12:27
ok, thx
Rafał Krzewski
@rkrzewski
Dec 19 2017 12:29
more interesting problem would be to do it generically for any IO type conforming to cats-effect typeclasses. But Future is not an IO type, so that's a completely different ball game :)
Kai(luo) Wang
@kailuowang
Dec 19 2017 12:59
@rossabaker yes!
Ross A. Baker
@rossabaker
Dec 19 2017 13:00
:christmas_tree:
Kai(luo) Wang
@kailuowang
Dec 19 2017 13:00
@milessabin no.
Since this is more a validation release, we could skip a more broad announcement.
Ross A. Baker
@rossabaker
Dec 19 2017 13:01
I’ve got ermine-parser and quiver releasaed on RC2 already. Working on cats-effect and iteratee. I’m sending PRs to whoever will take them so we can publish and test as much as we can.
Kai(luo) Wang
@kailuowang
Dec 19 2017 13:02
I can work on cats-mtl.
By the time we update all close ecosystem libraries, it might be close to 1.0 release already.
What do you guys think? Shall we announce on Twitter?
Luka Jacobowitz
@LukaJCB
Dec 19 2017 13:04
Yeah a small anouncement on Twitter can’t hurt, we want other people in the larger ecosystem to test as well, no?
I would mention the 7 day schedule, so people can decide for themselves
Ross A. Baker
@rossabaker
Dec 19 2017 13:15
:+1: to announcement. If we aren’t getting people beating on the RC, then there was no point in doing the RC.
Pascal Voitot
@mandubian
Dec 19 2017 13:47
:fire:
Bjørn Madsen
@aeons
Dec 19 2017 13:47
:shipit:
Marko Dimjašević
@mdimjasevic
Dec 19 2017 15:38
Hi everyone
Marko Dimjašević
@mdimjasevic
Dec 19 2017 15:45
When using Free monad as given at https://typelevel.org/cats/datatypes/freemonad.html , how to have a side-effecting interpreter that transforms an algebra to Id[A]? I see there is an example in the docs, but I get a compile error complaining there was a type mismatch - it found a Unit instead of an Id[A].
Id here is cats.Id
Luka Jacobowitz
@LukaJCB
Dec 19 2017 15:48
Is that the compiler complaining or the IDE?
Marko Dimjašević
@mdimjasevic
Dec 19 2017 15:49
the compiler via sbt
Luka Jacobowitz
@LukaJCB
Dec 19 2017 15:51
Can you show me more of the code
also btw as an aside, you should never have a side-effecting interpreter into Id :D
Rob Norris
@tpolecat
Dec 19 2017 15:54
Yep. Interpret into IO and then unsafe the result if you need to.
Luka Jacobowitz
@LukaJCB
Dec 19 2017 15:56
:+1:
Ross A. Baker
@rossabaker
Dec 19 2017 16:21
I found a problem with the deprecation notices on followedBy and forEffect. PR coming.
František Kocun
@fokot
Dec 19 2017 16:21

Do someone know how to handle this? This is Future for comprehension

for {
a <- doA
b <- doB(a)
_ <- b.optionalValue.map(doC(_)).getOrElse(Future.succestull(DEFAULT_VALUE))
d <- doD(a, b)
} yield d

doC returns Future and I want it only execute if b.optionalValue is not empty. can find suitable method on OptionT to unwrap it to default to Future[A]

Christopher Davenport
@ChristopherDavenport
Dec 19 2017 16:22
Use fold.
Cody Allen
@ceedubs
Dec 19 2017 16:24
A couple other approaches that I think would work: b.optionalValue.traverse(doC).map(_.getOrElse(DEFAULT_VALUE)) or OptionT(b.optionalValue.traerse(doc)).getOrElse(DEFAULT_VALUE)
František Kocun
@fokot
Dec 19 2017 16:25

@ChristopherDavenport like this?

_ <- customer.adBacklink.fold(Future.successful(defaultValue))(updateAdStatus)

Can I somehow get rid of Future.successful(?

Cody Allen
@ceedubs
Dec 19 2017 16:25
I don’t know if they are really any better
but b.optionalValue.traverse(doC) gets you back a Future[Option[C]]
František Kocun
@fokot
Dec 19 2017 16:27
@ceedubs that it not bad though. thanks
Rob Norris
@tpolecat
Dec 19 2017 16:29
Never pass up an opportunity to use traverse.
Loránd Szakács
@lorandszakacs
Dec 19 2017 16:35

folks, I have a question.

Is there a proper name for a function like "Applicative.traverse" but for Monads? Which respects their sequential compostability behavior.

I am looking for a name for such a function, because I need it as a replacement for scala's Future.traverse so as to not kill my execution context (and getting rid of Futures is an infinity march at this point). I naively named it Future.serialize. Would there be a more canonical name for this? :tired_face:

Mike (stew) O'Connor
@stew
Dec 19 2017 16:39
@lorandszakacs Monad extends Applicative, right? every Monad is also an Applicative, so yes, that's there and works fine
Cody Allen
@ceedubs
Dec 19 2017 16:40
@lorandszakacs I don’t know of a more general name for something like that. I think that what you want is still traverse, but its behavior depends on the Applicative instance that has been defined for Future. I’m pretty sure that the one in Cats is based on sequential flatMap calls. So if you do something like List(1, 2, 3).traverse(returnAFuture) it should execute them sequentially as opposed to if you do Future.traverse(List(1, 2, 3))(retrunAFuture)
Loránd Szakács
@lorandszakacs
Dec 19 2017 16:40
@stew. yes, I know, but the problem is that because .traverse is behavior on Applicatives, you do not get the "sequential" execution guarantees that Monads offer. i.e. it's a broader abstraction, I need a more precise one
@ceedubs, thank you! I understand.
Alexander Konovalov
@alexknvl
Dec 19 2017 16:41
forM
Luka Jacobowitz
@LukaJCB
Dec 19 2017 16:42
In cats, ap and flatMap should always be the same
there’s a law that checks that
if you want a different behaviour for ap use Parallel
Alexander Konovalov
@alexknvl
Dec 19 2017 16:43
traverse :: (Traversable t, Applicative f) => (a -> f b) -> t a -> f (t b)
mapM :: (Traversable t, Monad m) => (a -> m b) -> t a -> m (t b)
forM :: (Traversable t, Monad m) => t a -> (a -> m b) -> m (t b)
Cody Allen
@ceedubs
Dec 19 2017 16:44
@alexknvl forM is defined as flip mapM and mapM is defined as traverse :)
Fabio Labella
@SystemFw
Dec 19 2017 16:44

you do not get the "sequential" execution guarantees that Monads offer.

You do because as Luka says, there's a law that ensures they are consistent.
Haskell having multiple names for traverse is merely a historical thing.

Cody Allen
@ceedubs
Dec 19 2017 16:44
I suspect that forM only exists because Monad hasn’t always extended Applicative
or whatever the Haskell equivalent of that statement is :)
Fabio Labella
@SystemFw
Dec 19 2017 16:45
that's exactly why (for mapM)
forM is useful for syntax, but it should have an Applicative constraint
also, can we please remove that horrid side-effectful interpretation into Id from our official docs?
Cody Allen
@ceedubs
Dec 19 2017 16:46
@LukaJCB technically the laws are only checking that the result is the same and aren’t checking the execution semantics, so they wouldn’t detect parallelization in Future instances I believe
Luka Jacobowitz
@LukaJCB
Dec 19 2017 16:46
That is correct indeed
Loránd Szakács
@lorandszakacs
Dec 19 2017 16:49

aha, I see.

I really do only need a name that expresses execution semantics as well :D. Since I am currently knee-deep in legacy code that wildly uses scala.concurrent.Future.traverse :fearful:. And replacing those with a syntactically equivalent Future.functionWithTheSameSignatureAsTraverse is the best I can do now in the short run.

thanks for all your help
Cody Allen
@ceedubs
Dec 19 2017 16:51
@lorandszakacs ah I see. In that case, maybe Future.mTraverse for “monadic traverse”?
or I guess there’s always forM like @alexknvl suggested
@SystemFw I’m open to it, but I’m not sure what we would change it to. I think that if we started using cats-effect in the docs we would run into a cyclical dependency issue.
I guess we could do something a little dodgy like define Type IO[A] = Eval[A] and leave a disclaimer that this is just for the example and that in the real world you should use cats-effect. But then you won’t have syntax like IO { … }
Loránd Szakács
@lorandszakacs
Dec 19 2017 16:55
@ceedubs, that is an excellent name! Thanks
Fabio Labella
@SystemFw
Dec 19 2017 17:04
@ceedubs Yeah, it's very annoying :(
I do wonder if there's an sbt incantation...
Cody Allen
@ceedubs
Dec 19 2017 17:12
Yeah I’ve thought about it a little bit, but I can’t think of anything better than using Id or Function0 or Eval but giving a big disclaimer that in the real world you should use cats.effect.IO
or something similar
Fabio Labella
@SystemFw
Dec 19 2017 17:13
I think Eval is still better than Id
I remember having to re-explain the Free monad a few times
because people are expecting to interpret to a result, rather than translate to another monad
Cody Allen
@ceedubs
Dec 19 2017 17:14
my only hesitation with Eval is that historically people have used it as an IO type and it’s really not meant for that and problems ensue. Using Function0 for side-effects is dirty enough that in my mind people are less likely to try to use it in the real-world
Colt Frederickson
@coltfred
Dec 19 2017 17:15
I love the idea that it's just not dirty enough ....
Cody Allen
@ceedubs
Dec 19 2017 17:15
Hmm but I guess that’s essentially what people do for side effects in all of Java and most of scala, so maybe that’s false optimism on my end :)
But I could see an argument that translating to Eval would give people a better feel for translating to an IO type
Fabio Labella
@SystemFw
Dec 19 2017 17:16

my only hesitation with Eval is that historically people have used it as an IO type and it’s really not meant for that and problems ensue.

the problem is that I fully agree...

can we not make examples a different project that depends on both cats and cats-effect?
Rob Norris
@tpolecat
Dec 19 2017 17:17
What am I missing? Applicative traverse preserves the order of effects.
Luka Jacobowitz
@LukaJCB
Dec 19 2017 17:17
I think we found a way to use cats-effect inside cats docs last time we talked about this
Fabio Labella
@SystemFw
Dec 19 2017 17:17
and just use IO like we're meant to
ah, it wasn't only in my head then!
Luka Jacobowitz
@LukaJCB
Dec 19 2017 17:17
Yeah, I think we can definitely do that
docs is a separate sbt module
Rob Norris
@tpolecat
Dec 19 2017 17:18
I think cats-effect needs to get folded into cats for 1.1
Luka Jacobowitz
@LukaJCB
Dec 19 2017 17:18
:+1:
Btw have we reached consensus on cats-collection yet?
I still have those NonEmptySet and NonEmptyMap lying around :D
Cody Allen
@ceedubs
Dec 19 2017 17:19
If it gets folded in, then there shouldn’t be issues. If it doesn’t, then @LukaJCB I think that you are going to run into issues with docs referencing the latest cats source but the published version of cats-effect, which could lead to version conflicts
@LukaJCB I don’t know. Modularization is hard in scala :(
Luka Jacobowitz
@LukaJCB
Dec 19 2017 17:21
I made an issue some time around
Yes, to get around what you mentioned, we can pin docs to the latest version, no?
Rob Norris
@tpolecat
Dec 19 2017 17:24
Does it matter? As long as we're maintaining bincompat between now and when effect gets assimilated it should be ok, seems like.
Cody Allen
@ceedubs
Dec 19 2017 17:26
All I know is that every time I’ve ever convinced myself that a cyclical dependency would be fine it has become a huge pain :P
Rob Norris
@tpolecat
Dec 19 2017 17:29
mm. maybe. "huge pain" is the eventual consistent state for all computer-related activities
Cody Allen
@ceedubs
Dec 19 2017 17:30
true
Zak Patterson
@zakpatterson
Dec 19 2017 17:48

hey i ran into a new confusing thing today, i think i understand why it's happening, but I wouldn't be able to explain well:

So any type A is implicitly convertible to Id[A], and Id[A] is implicitly convertible to A, but if we need a Functor[Id], we don't have that implicitly:

just importing import cats._, cats.implicits._:

scala> 2.fproduct(_ + 1)             // fproduct is defined on Functor, and we know we can turn 2 into Id[Int]... so why not do?
<console>:18: error: value fproduct is not a member of Int
       2.fproduct(_ + 1)
         ^

scala> 2.pure[Id].fproduct(_ + 2)        //Have to lift into Id functor to use method of Functor[F[_]]
res1: cats.Id[(Int, Int)] = (2,4)

scala> 2.pure[Id].fproduct(_ + 2).swap     // implicitly converting Id[(A, B)] to (A, B) to find swap method on Tuple2
res14: (Int, Int) = (4,2)
i suppose if fproduct worked on values, then map would too. 2.map(_ + 2) would be silly i guess
Rob Norris
@tpolecat
Dec 19 2017 17:51
I have wanted Id(42) before to avoid pure.
Luka Jacobowitz
@LukaJCB
Dec 19 2017 17:52
def Id[A](a: A): Id[A] = a?
Rob Norris
@tpolecat
Dec 19 2017 17:52
Yeah or object Id { def apply
I'm not really convinced type Id[A] = A is right but I guess I wasn't around for the argument.
I kind of want it to behave like a data constructor.
Cody Allen
@ceedubs
Dec 19 2017 17:55
type Id[A] = String. In my experience, people really love strings.
Rob Norris
@tpolecat
Dec 19 2017 17:56
lol
Long Cao
@longcao
Dec 19 2017 17:56
my eyes, they burn
Luka Jacobowitz
@LukaJCB
Dec 19 2017 17:56
:joy:
Rob Norris
@tpolecat
Dec 19 2017 17:56
perfect
Cody Allen
@ceedubs
Dec 19 2017 17:58
On a more serious note, I think that there is probably a valid argument for making Id a for-real data constructor. However, there would probably be some allocation overhead since scala doesn’t have a great story for newtypes (yet), and it’s probably a bit late to muck with this now.
Luka Jacobowitz
@LukaJCB
Dec 19 2017 17:58
Yeah, newtypes should be a definite priority for cats 2.0
Cody Allen
@ceedubs
Dec 19 2017 17:59
Eval.Now is essentially what you would want, but you’d keep calling things and getting Eval[A] as a return type instead of Now[A] and things would break down for you
Zak Patterson
@zakpatterson
Dec 19 2017 18:00
what am i missing here tho? if type Id[A] = A, and there's a Functor for Id, then why can't i just map on an A using functor syntax?
Luka Jacobowitz
@LukaJCB
Dec 19 2017 18:02
Because the compiler can’t detect isomorphisms
Zak Patterson
@zakpatterson
Dec 19 2017 18:02
yeah i have to annotate that it's an Id[A] somehow, like (2 : Id[Int]).map(_+2)
Cody Allen
@ceedubs
Dec 19 2017 18:02
@zakpatterson If the compiler sees A it won’t also look for things that would work with Id[A]. You can think of situations in which this would cause ambiguities. For example if I have an (A, B) and I call map am I trying to use the Functor instance for Tuple2 or for Id?
Rob Norris
@tpolecat
Dec 19 2017 18:02
For instance if you say List(List(1,2,3)).map(_.length) is the answer 1 or List(3)?
Cody Allen
@ceedubs
Dec 19 2017 18:03
yeah Rob’s example is probably better
Rob Norris
@tpolecat
Dec 19 2017 18:05
Related, this is also the reason we can't auto-compose functors. List[Option[A]] is a functor in two ways but we only consider the outer one.
Luka Jacobowitz
@LukaJCB
Dec 19 2017 18:05
Yeah, if only the compiler knew our intention :P
Colt Frederickson
@coltfred
Dec 19 2017 18:06
What's the best way to find all the cats types that implement a typeclass?
Zak Patterson
@zakpatterson
Dec 19 2017 18:06
both good, i'm getting it, that idea about how the compiler searches for an implicit functor makes sense.... buuut.... why this then...??
scala> (2 : Id[Int]).map(_ => 3)
res22: cats.Id[Int] = 3

scala> (List(2,3,4) : Id[List[Int]]).map(_ => 100)
res23: List[Int] = List(100, 100, 100)
ah @tpolecat i think answered that while i was fiddling in repl
Luka Jacobowitz
@LukaJCB
Dec 19 2017 18:07
It calls the mapmethod on List not the Functor one
Zak Patterson
@zakpatterson
Dec 19 2017 18:08
oh. because scala's collection list has a map method
hrmf
Luka Jacobowitz
@LukaJCB
Dec 19 2017 18:08
Yup!
@coltfred if you find out, please tell me :D
Cody Allen
@ceedubs
Dec 19 2017 18:09
hmm if it didn’t then would it use the Functor[Id] for the map? I am not sure of the answer to that. Even though I’ve used Scala for quite a while I still hit puzzlers that I don’t know the answer to :)
@coltfred grep? :(
I would love to have a better story for that
Colt Frederickson
@coltfred
Dec 19 2017 18:10
That was my suspicion.
Luka Jacobowitz
@LukaJCB
Dec 19 2017 18:10
With “cats types” do you mean cats data types?
Rob Norris
@tpolecat
Dec 19 2017 18:10
That's actually a good argument for a data type.
Cody Allen
@ceedubs
Dec 19 2017 18:10
grep really doesn’t work well though because if you are looking for Applicative[MyThing] but the instance is defined as Monad[MyThing] you won’t find it with grep
Rob Norris
@tpolecat
Dec 19 2017 18:11
I would have expected res23 above to be 100
Zak Patterson
@zakpatterson
Dec 19 2017 18:11
yeah it's this,
scala> (List(2,3,4) : Id[List[Int]]).fproduct(_ => 100)
res24: cats.Id[(List[Int], Int)] = (List(2, 3, 4),100)

scala> List(2,3,4).fproduct(_ => 100)
res25: List[(Int, Int)] = List((2,100), (3,100), (4,100))
fproduct is better to use because scala's list doesn't have one
Rob Norris
@tpolecat
Dec 19 2017 18:11
Right.
Luka Jacobowitz
@LukaJCB
Dec 19 2017 18:11
Yeah, makes sense
Rob Norris
@tpolecat
Dec 19 2017 18:11
no me gusta
Luka Jacobowitz
@LukaJCB
Dec 19 2017 18:11
so if you’d used fmap instead of map in the snippet, it would be 100
Cody Allen
@ceedubs
Dec 19 2017 18:12
ah right. This makes me smile out of some morbid fascination
Zak Patterson
@zakpatterson
Dec 19 2017 18:12
is there an alias fmap ?
Luka Jacobowitz
@LukaJCB
Dec 19 2017 18:12
yup!
in RC2 at least
Rob Norris
@tpolecat
Dec 19 2017 18:13
It makes sense but it's surprising.
To me.
Zak Patterson
@zakpatterson
Dec 19 2017 18:14
oh i'm on 0.9.0 i think
yeah converting Id[List[A]] => List[A] to get the map method first instead of getting the map method from Functor seems weird
Zak Patterson
@zakpatterson
Dec 19 2017 19:03
can sure make some goofy examples:
scala> "WEIRD".pure[Id].flatMap(_ => List(100,101,102).pure[Id])                                                          ^
res16: scala.collection.immutable.IndexedSeq[Int] = Vector(100, 101, 102, 100, 101, 102, 100, 101, 102, 100, 101, 102, 100, 101, 102)
Luka Jacobowitz
@LukaJCB
Dec 19 2017 19:03
wat
Where does that Vector come from??
Zak Patterson
@zakpatterson
Dec 19 2017 19:04
string has a flatmap method that takes a gentraversable
Luka Jacobowitz
@LukaJCB
Dec 19 2017 19:04
Oh, yeah, lol :D
That’s still weird to me
The String Monad
Zak Patterson
@zakpatterson
Dec 19 2017 19:05
precisely the kind of thing I'd want to use cats to fix
it's scala's name resolution order thing right? it resolves the type alias first and then looks up the method? instead of looking at implicit conversions first?
Luka Jacobowitz
@LukaJCB
Dec 19 2017 19:09
Yeah, implicits are sort of a last resort by the compiler
Rajiv Jhoomuck
@zeitgeist7
Dec 19 2017 19:14
Hello everyone
Luka Jacobowitz
@LukaJCB
Dec 19 2017 19:15
:wave:
shawjef3
@shawjef3
Dec 19 2017 20:44
Is there a special import I need to use mapN on a tuple of ValidatedNels? The compiler is telling me it can't find the method.
I'm using Scala 2.11, and tried cats 1.0.0-RC2 and -MF.
Abdhesh Kumar
@abdheshkumar
Dec 19 2017 20:46
import cats.implicits._, try this
Luka Jacobowitz
@LukaJCB
Dec 19 2017 21:00
You got partial-unification @shawjef3 ?
shawjef3
@shawjef3
Dec 19 2017 21:04
error: value mapN is not a member of (cats.data.ValidatedNel[...
import cats.implicits._ didn't help. I have
import cats.data._
import cats.data.Validated._
import cats.implicits._
Abdhesh Kumar
@abdheshkumar
Dec 19 2017 21:06
I have minimal build.sbt with use of mapN funtion
shawjef3
@shawjef3
Dec 19 2017 21:10
interesting. I thought the values in the tuples needed to be Validated.
Cody Allen
@ceedubs
Dec 19 2017 21:11
@abdheshkumar it’s because the type is inferring as Some[Int] instead of Option[Int]. Try using 1.some instead of Some(1)
at least I think that’s what’s happening
Luka Jacobowitz
@LukaJCB
Dec 19 2017 21:13
I think Abdhesh’s code works, right?
Cody Allen
@ceedubs
Dec 19 2017 21:13
oh haha sorry I just realized that
Abdhesh Kumar
@abdheshkumar
Dec 19 2017 21:13
yeah we can. I don't have problem in my code. It works fine either 1.some or Some(1)
Cody Allen
@ceedubs
Dec 19 2017 21:13
I got mixed up about who was reporting what issue
Luka Jacobowitz
@LukaJCB
Dec 19 2017 21:13
@shawjef3 You may have overseen, but have you enabled partial unification?
Cody Allen
@ceedubs
Dec 19 2017 21:14
partial unification instructions here: https://github.com/typelevel/cats#getting-started
shawjef3
@shawjef3
Dec 19 2017 21:19
@LukaJCB I guess I haven't.
damn it! We're using scala 2.11.8. One version short of what I'd need.
Thanks anyway.
Luka Jacobowitz
@LukaJCB
Dec 19 2017 21:25
Don’t worry
addSbtPlugin("org.lyranthe.sbt" % "partial-unification" % "1.1.0”)
works with 2.11.8
Or what speaks against updating to a compatible version like 2.11.12? @shawjef3
shawjef3
@shawjef3
Dec 19 2017 21:34
So this is what is lame - my company uses a custom build tool, so it's not trivial to change Scala versions. We're migrating to Gradle, but it's going to be a while.
Luka Jacobowitz
@LukaJCB
Dec 19 2017 21:36
Oh, that’s too bad, and you can’t use sbt plugins either I guess? :/
Can you add compiler plugins?
Rob Norris
@tpolecat
Dec 19 2017 21:40
It's ok for you to complain about this to whoever is making you do it.
It's a poor situation to be in.
Luka Jacobowitz
@LukaJCB
Dec 19 2017 21:41
Indeed.
shawjef3
@shawjef3
Dec 19 2017 21:41
I can add command line options, but that's about it.
I could increase our Scala version, but at this point it's not worth it. I'll just wait for Gradle.
Luka Jacobowitz
@LukaJCB
Dec 19 2017 21:43
Good luck!
OlegYch
@OlegYch
Dec 19 2017 21:46
gradle...
shawjef3
@shawjef3
Dec 19 2017 21:50
It's much better than what we have.
OlegYch
@OlegYch
Dec 19 2017 22:01
it is much worse than what pretty much everyone is using too
ritschwumm
@ritschwumm
Dec 19 2017 22:19
@OlegYch never having used gradle with scala - but often having used sbt in anger - why?
OlegYch
@OlegYch
Dec 19 2017 22:23
that would be one of the reasons
ritschwumm
@ritschwumm
Dec 19 2017 22:40
probably. but still - what's so bad about gradle for scala? a friend of mine seems to be a lot happier with it than he ever was with sbt - so i'd like to know about the downsides.
OlegYch
@OlegYch
Dec 19 2017 22:47
my bet is that if you ask your friend you won't hear anything coherent
as for me: 1. no one uses it 2. it's in groovy 3. it has the same problems otherwise
Christian Pérez-Llamas
@chris-zen
Dec 19 2017 22:50
After one year using Gradle (enforced by the company), I’d say that I really miss SBT, not because Gradle is bad, but because SBT is much more focused on Scala, and makes working with it much easier (like for example the partial-unification case, and the same with plenty of other plugins, less verbose, cross compilation, ...).