2010-05-25 48 views
6

Tôi chỉ pottering về với Tony Morris' excellent exercise on catamorphisms, khi tôi đang suy nghĩ chuyện gì đang xảy ra trong tình huống sau đây ...Scala suy luận kiểu câu hỏi

def cata[X](some: A => X, none: => X): X 

Bây giờ tôi gọi phương pháp này như sau:

def isDefined: Boolean = cata(_ => true, false) 

Tôi đã tự hỏi liệu trình inferencer loại có xác định loại _ => trueA => Boolean hoặc Any => Boolean. Do thực tế rằng Function1contra-biến trong tham số đầu vào của nó, cả hai sau biên dịch tốt:

def isDefined: Boolean = cata((_: A) => true, false) //#1 
def isDefined: Boolean = cata((_: Any) => true, false) //#2 

Vậy câu hỏi là, không loại inferencer đưa ra # 1 hoặC# 2?

Trả lời

7

tôi đã cố gắng này ra:


trait MyOption[+A] { 
    def cata[X](some: A => X, none: => X): X 
    def isDefined: Boolean = cata(_ => true, false) 
} 

và biên soạn này với scalac -Xprint:types. Điều này đưa ra kết quả sau:


[[syntax trees at end of typer]]// Scala source: myoption.scala 
package { 
    abstract trait MyOption[A >: Nothing : Nothing X, none: => X): X; 
    def isDefined: Boolean = MyOption.this.cata[Boolean](((x$1: A) => true), false) 
    } 
} 

Vì vậy, ngoại hình của nó, loại inferencer đã đưa ra tùy chọn # 1.

+0

Bạn đang sử dụng phiên bản 'scalac' nào? –

+0

Tôi đang sử dụng 2.8.0 RC2 –

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