Tôi đang cố gắng viết một hàm sử dụng lại chuyển đổi tiềm ẩn mà tôi có đối tượng A -> Object B khi chúng được bao bọc trong một Option theo cách tổng quát để các chuyển đổi Option [A] -> Option [B] cũng hoạt động.Scala: Chuyển đổi ẩn A-> B hoạt động cho Option [A] -> Option [B]
Những gì tôi đã đưa ra là:
implicit def fromOptionToOption[A, B](from: Option[A])(implicit conversion: (A) => B): Option[B] = from.map(conversion(_))
này hoạt động khi tôi gán Một số (..) đến một giá trị nhưng không khi tôi gán một lựa chọn val; xem đầu ra bảng điều khiển sau:
scala> trait T
defined trait T
scala> case class Foo(i: Int) extends T
defined class Foo
scala> case class Bar(i: Int) extends T
defined class Bar
scala> implicit def fromFooToBar(f: Foo):Bar = Bar(f.i)
fromFooToBar: (f: Foo)Bar
scala> implicit def fromBarToFoo(b: Bar):Foo = Foo(b.i)
fromBarToFoo: (b: Bar)Foo
scala> implicit def fromOptionToOption[A, B](from: Option[A])(implicit conversion: (A) => B): Option[B] = from.map(conversion(_))
fromOptionToOption: [A, B](from: Option[A])(implicit conversion: (A) => B)Option[B]
scala> val foo: Option[Foo] = Some(Bar(1))
foo: Option[Foo] = Some(Foo(1))
// THIS WORKS as expected
scala> val fooOpt = Some(Foo(4))
fooOpt: Some[Foo] = Some(Foo(4))
scala> val barOpt2: Option[Bar] = fooOpt
<console>:16: error: type mismatch;
found : Some[Foo]
required: Option[Bar]
val barOpt2: Option[Bar] = fooOpt
^
//THIS FAILS.
Tôi thực sự không thấy sự khác biệt giữa chuyển đổi đầu tiên và thứ hai. Bằng cách nào đó nó không gọi chuyển đổi ngầm trong cái sau. Tôi đoán nó có cái gì đó để làm với hệ thống loại, nhưng tôi không thể nhìn thấy như thế nào được nêu ra. Bất kỳ ý tưởng? -Albert (Tôi đang ở trên scala 2.9.1)
Trong trường hợp đầu tiên, nó gọi 'fromFooToBar' một mình (nó quyết định vì nó cần' Option [Bar] ', nó thực sự gọi là' Some (x: Bar) ', và chuyển đổi thành đến đó); trong lần thứ hai nó phải gọi 'fromOptionToOption' và không. Điều này giải thích sự khác biệt, nhưng tôi không chắc chắn làm thế nào để giải quyết vấn đề. –
Lưu ý: 'val barOpt: Option [Bar] = Một số (Foo (4))' hoạt động như mong đợi. –
@Dan Burton - Chính xác; điều này là bởi vì nó được biến thành 'Some (fromBarToFoo (Foo (4)))'. –