These are chat archives for scalajp/functional

9th
Sep 2015
Kuchitama
@Kuchitama
Sep 09 2015 03:36
@xuwei-k さんの記事 http://d.hatena.ne.jp/xuwei/20140129/1390890980 を元に、↓みたいなコードを書いているのですが、エラーで動かず…
val futureNest:Future[List[Future[Hoge]]] = // ...
val a:Future[Future[List[CategoryInfo]]] = futureNest.map(_.sequence) // => Future[Noghitng[Future[Nothing]]]

// [error] could not find implicit value for parameter G: scalaz.Applicative[G]
// [error]     val a = resutlFutureNest.map(_.sequence)
// [error]                                    ^
どなたか、どうすればいいかご存知のかたいらっしゃいませんか?
Manabu Nakamura
@gakuzzzz
Sep 09 2015 03:45
Applicative[Future] が見つかって無いっぽいですね。
import scalaz.std.scalaFuture._
で行かないでしょうか?
あ、ちがう、 Applicative[List] の方か
import scalaz.std.list._
かな
Kuchitama
@Kuchitama
Sep 09 2015 03:55
ありがとうございます。Applicative[List] だったみたいです。で、更に別のエラーが。。。
[error]  value sequence is not a member of List[scala.concurrent.Future[Hoge]]
[error]     futureNest.map(_.sequence).join
[error]                            ^
↓はimport済みなんですが…
import scalaz.std.scalaFuture._
Manabu Nakamura
@gakuzzzz
Sep 09 2015 03:57
This message was deleted
This message was deleted
import scalaz.syntax.traverse._
ですね
Kuchitama
@Kuchitama
Sep 09 2015 04:00
エラー変わらないです…
Manabu Nakamura
@gakuzzzz
Sep 09 2015 04:01
おや
Kuchitama
@Kuchitama
Sep 09 2015 04:01
現在のImport
import scalaz._,Scalaz._
import scalaz.std.scalaFuture._
import scalaz.std.list._
import scala.concurrent._
import scalaz.syntax.traverse._
import play.api.libs.concurrent.Execution.Implicits._ // Play2.4 使ってます
kenji yoshida
@xuwei-k
Sep 09 2015 04:05
gist自体のimport書き換えておいた
Manabu Nakamura
@gakuzzzz
Sep 09 2015 04:06
scala> import scala.concurrent.Future
import scala.concurrent.Future

scala> val f: Future[List[Future[String]]] = Future.failed(new RuntimeException)
f: scala.concurrent.Future[List[scala.concurrent.Future[String]]] = scala.concurrent.impl.Promise$KeptPromise@73a6c4aa

scala> import scalaz._
import scalaz._

scala> import scalaz.std.scalaFuture._
import scalaz.std.scalaFuture._

scala> import scalaz.std.list._
import scalaz.std.list._

scala> import scalaz.syntax.traverse._
import scalaz.syntax.traverse._

scala> import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.ExecutionContext.Implicits.global

scala> f.map(_.sequence)
res1: scala.concurrent.Future[scala.concurrent.Future[List[String]]] = scala.concurrent.impl.Promise$DefaultPromise@7bd648da

scala>
いくっぽい。なんだろう?
kenji yoshida
@xuwei-k
Sep 09 2015 04:07
Scalaz._ をしてるなら他全部いらないのでは
同じimplicitのimport2回やると無効になる、みたいな面倒な謎挙動あった気がする
Scalaz._ だけで済ませるか、個別にimportするかどちらか
Scalaz._ をやると、覚えること少なくてすむけど、コンパイル速度遅くなったり、そのファイル内でscalazのどの機能が使われてるのかわかりずらくなる。個別importだとその逆
Naoki Aoyama
@aoiroaoino
Sep 09 2015 04:10
scala.concurrent.FutureってそもそもTraverseのインスタンス定義されてないきがするんですけど、そういうことではないんでしたっけ?
https://github.com/scalaz/scalaz/blob/series/7.2.x/core/src/main/scala/scalaz/std/Future.scala
kenji yoshida
@xuwei-k
Sep 09 2015 04:13
FutureのTraverseはないけど、 List[Future[A]]Future[List[A]] に変換しようとしてる?のだったら、FutureのTraverseは必要ないはずですね
Naoki Aoyama
@aoiroaoino
Sep 09 2015 04:13
This message was deleted
This message was deleted
ごめんなさい、勘違いっぽい
Manabu Nakamura
@gakuzzzz
Sep 09 2015 04:29
関係ないけど、mapしてからjoinするなら最初からflatMapした方がいいかもですね
Kuchitama
@Kuchitama
Sep 09 2015 04:31
import 整理したらcompile通りました
import scalaz._,Scalaz._
import play.api.libs.concurrent.Execution.Implicits._
import scala.concurrent._
//import scalaz.std.scalaFuture._
//import scalaz.std.list._
//import scalaz.syntax.traverse._

同じimplicitのimport2回やると無効になる、みたいな面倒な謎挙動あった気がする

import Scalaz._ しているのに import scalaz.std.scalaFuture._ していたのがそもそもの問題だったみたいです。

@xuwei-k @gakuzzzz @aoiroaoino みなさん、ありがとうございました。
kenji yoshida
@xuwei-k
Sep 09 2015 04:34

mapしてからjoinするなら最初からflatMap

たしかに。自分のは説明の都合上わざと個別に呼んだのだったか、とくに深く考えてなかったのか

Manabu Nakamura
@gakuzzzz
Sep 09 2015 04:46
説明の都合だと思ってました。
ところで、Scalaz._で問題なかったのなら何でApplicative[List]が見つからなかったのでしょうね?
Kuchitama
@Kuchitama
Sep 09 2015 05:04
謎ですね…