2017-04-05 17 views
5

Có cách nào, để truy cập loại A từ Some[A]?Nhận từ 'Một số [A] `đến` A`

type X = Some[Int] 
type Y = ??? // what do I have to write here to get `Int` 

tôi có thể xác định Option kiểu của riêng tôi mà cho phép này:

sealed trait Option[+A] 
case object None extends Option[Nothing] 
case class Some[+A](a: A) { 
    type Inner = A 
} 

và sau đó sử dụng

type X = Some[Int] 
type Y = X#Inner 

Đây có phải là cũng có thể bằng cách nào đó với bình thường Scala loại Lựa chọn?

+0

Nó nhắc nhở tôi về https: // stackoverflow.com/questions/29038214/why-scala-does-not-have-a-decltype và https://stackoverflow.com/questions/29034921/can-function-type-be-defined-by-inference – Suma

+1

Tôi nghĩ nói chung, điều này có thể không thực hiện được, nhưng tùy thuộc vào trường hợp sử dụng của bạn, bạn có thể lấy nó thông qua một cái gì đó như 'def x [T] (opt: Option [T]) {/ * T có sẵn tại đây * /}' hoặc có thể với con đường phụ thuộc vào ty pe. –

Trả lời

2

đây là một giải pháp có sử dụng đường loại phụ thuộc để phục hồi loại từ giá trị:

trait IsOption[F]{ 
    type T  
    def apply(f: F): Option[T] 
    } 
    object IsOption{ 
    def apply[F](implicit isf: IsOption[F]) = isf  
    implicit def mk[A] = new IsOption[Option[A]]{ 
     type T = A  
     def apply(f: Option[A]): Option[A] = f 
    } 
    } 
    def getInner[A](in:A)(implicit inner: IsOption[A]): Option[inner.T] = inner(in) 

Câu trả lời là rất nhiều cảm hứng từ slide này của một bài thuyết trình tuyệt vời: http://wheaties.github.io/Presentations/Scala-Dep-Types/dependent-types.html#/2/1

Bạn có một chức năng tiếp nhận một A mờ đục, nhưng bạn phục hồi thực tế rằng nó là một tùy chọn và kiểu bên trong thông qua các ngụ ý IsOption[A].

Tôi đánh giá cao rằng đây không phải là chính xác những gì bạn đã yêu cầu, nhưng khi bạn sử dụng các loại phụ thuộc như vậy. bạn cần có một giá trị cụ thể mà từ đó bạn khôi phục một loại.

+0

Giải pháp này không cần phải có giá trị 'A' để lấy kiểu' T', chỉ có một 'IsOption [A]' ẩn (mà sẽ luôn nằm trong phạm vi khi cần). Vì vậy, đây là những gì đã được yêu cầu, IMO. –

+0

Tuy nhiên, bạn không thể làm điều gì đó như 'loại Bên trong = IsOption [Tùy chọn [Int]] # T' Nhưng có, một hàm như' def getInner [A] (ẩn bên trong: IsOption [A]): ​​Option [inner .T] = ??? 'là hợp lệ nhưng có thể có giá trị giới hạn. –

+2

Bạn có thể làm 'val isOpt = ngầm [Tùy chọn [T]]; nhập Inner = isOpt.T' –

1

Bạn có thể viết một hàm kiểu đơn giản như sau:

scala> type X = Some[Int] 
defined type alias X 

scala> type F[H <: Option[A], A] = A 
defined type alias F 

scala> type Y = F[X, Int] 
defined type alias Y 

scala> implicitly[Y =:= Int] 
res3: =:=[Y,Int] = <function1> 

Nếu không có phần ứng dụng kiểu tham số/suy luận đó là không phải là rất hữu ích, nhưng nó hoạt động ...

Các vấn đề liên quan