6

私は遊んでいましたがListW.<^>、その定義は次のとおりです。

def <^>[B: Zero](f: NonEmptyList[A] => B): B = value match {
  case Nil => ∅
  case h :: t => f(Scalaz.nel(h, t))
}

この例のタイプOptionとしてどのように来たのかわかりませんZero

scala> case class CC(v : Int)
defined class CC

scala> val posns = List(CC(2), CC(5), CC(1))
posns: List[CC] = List(CC(2), CC(5), CC(1))

だから今私はこれらのもののリストを持っています。私の目標は、ゼロ未満の値がなく、最大値が類似している場合に、最小Option[CC]値/最大値posnsを取得することです。None

scala> import scalaz._; import Scalaz._
import scalaz._
import Scalaz._

scala> implicit val CCOrder = new Order[CC] { 
       | def order(v1 : CC, v2 : CC) = orderBy( (v : CC) => v.v ).order(v1, v2) 
       | }
CCOrder: java.lang.Object with scalaz.Order[CC] = $anon$1@1e48d65

scala> posns.filter(_.v < 0) <^> (_.min)
res0: Option[CC] = None

scala> posns.filter(_.v > 0) <^> (_.max)
res1: Option[CC] = Some(CC(5))

オプションはまさにZero私が欲しかったタイプでした!Optionタイパーがどうやって選ばれたのか、誰か説明できますか?私はそれをどこにも宣言しません!

4

1 に答える 1

5

ListW#<^>およびの定義MA#min

sealed trait MA[M[_], A] extends PimpedType[M[A]] {
  def min(implicit r: Foldable[M], ord: Order[A]): Option[A] =
    foldl1((x: A, y: A) => if (x ≨ y) x else y)
}

sealed trait ListW[A] extends PimpedType[List[A]] {
  def <^>[B: Zero](f: NonEmptyList[A] => B): B = value match {
    case Nil => ∅
    case h :: t => f(Scalaz.nel(h, t))
  }
}

関連する推論されたタイプ、暗黙の変換、および暗黙のパラメーターは次のとおりです。scalac -Xprint:typerこれを明らかにします。

object test {
  import scalaz._
  import Scalaz._

  case class CC(v: Int)
  val posns = List(CC(2), CC(5), CC(1))
  val filtered = posns.filter(((x$1: CC) => x$1.v.<(0)))
  val listw = Scalaz.ListTo[CC](posns.filter(((x$1: CC) => x$1.v.<(0))))
  listw.<^>[Option[CC]]{
    (x$2: scalaz.NonEmptyList[CC]) =>
      Scalaz.maImplicit[scalaz.NonEmptyList, CC](x$2).min(Foldable.NonEmptyListFoldable, CCOrder)
  }(Zero.OptionZero[CC]);
}

List@#<^>NonEmptyList[A] => Bpimpedリストが空でない場合から、提供された関数を実行します。それ以外の場合は、 Zeroforタイプを返しますBMA#min実際には戻りますOption[B]-これはコンテナの一般的な関数であり、NonEmptyListを返す可能性のあるの特定の関数ではありませんB

これを実現するためのより直接的な方法は、MA#min直接呼び出すことです。残念ながら、Scala 2.8の新機能でListある関数がすでにあるため、暗黙のビューはタイプヒントなしではトリガーされません。minMA

posns.filter(_.v < 0).min
<console>:16: error: could not find implicit value for parameter cmp: Ordering[CC]
   posns.filter(_.v < 0).min

(posns.filter(_.v < 0): MA[List, CC]).min
res7: Option[CC] = None

これは、Scalazでシンボリック識別子を提供する動機付けの理由の1つです。これは、名前空間の大まかな形式です。

補足:インスタンスのインスタンスを単純化して、次のことを行うことができOrderますCC

implicit val CCOrder: Order[CC] = orderBy(_.v)
CCOrder: scalaz.Order[CC] = scalaz.Orders$$anon$2@fc2528
于 2010-07-28T10:46:16.183 に答える