2

type の関数がいくつかあるとしますInt => Option[Int]

def foo(n: Int): Int => Option[Int] = {x => if (x == n) none else x.some}

val f0 = foo(0)
val f1 = foo(1)

>=>次のように構成できます。

val composed: Int => Option[Int] = Kleisli(f0) >=> Kleisli(f1)

リストからすべての関数を作成する必要があるとします。

val fs: List[Int => Option[Int]] = List(0, 1, 2).map(n => foo(n))

私はそれを行うことができmapますreduce

val composed: Int => Option[Int] = fs.map(f => Kleisli(f)).reduce(_ >=> _)

それ(composed上記)を単純化できますか?

4

2 に答える 2

1

[A] Kleisli[Option, A, A]SemigroupviaComposeであるため、次を使用できますfoldMap1

val composed: Int => Option[Int] = fs.foldMap1(f => Kleisli(f))

興味深いことに、これは機能しませんが、正しいインスタンスを明示的に渡すと機能します:

scala> val gs = NonEmptyList(fs.head, fs.tail: _*)
gs: scalaz.NonEmptyList[Int => Option[Int]] = NonEmptyList(<function1>, <function1>, <function1>)
scala> gs.foldMap1(f => Kleisli(f))(Kleisli.kleisliCompose[Option].semigroup[Int])
res20: scalaz.Kleisli[Option,Int,Int] = Kleisli(<function1>)
scala> gs.foldMap1(f => Kleisli(f))(Kleisli.kleisliCompose[Option].semigroup[Int]).apply(1)
res21: Option[Int] = None

優先しているように見えるインスタンスがどこから来ているのかわかりません。

于 2015-07-13T09:50:23.023 に答える