2010-03-13 16 views
22

Tôi đang đấu tranh để hiểu chính xác nó có ý nghĩa gì khi một giá trị có loại A @cpsParam[B,C] và loại biểu mẫu này tôi nên gán cho các giá trị của tôi khi sử dụng cơ sở tiếp tục phân tách.Không hiểu cách gõ liên tục phân cách của Scala (A @cpsParam [B, C])

tôi đã xem xét một số nguồn tin:

http://lamp.epfl.ch/~rompf/continuations-icfp09.pdf

http://www.scala-lang.org/node/2096

http://dcsobral.blogspot.com/2009/07/delimited-continuations-explained-in.html

http://blog.richdougherty.com/2009/02/delimited-continuations-in-scala_24.html

nhưng họ không cho tôi nhiều vào trực giác này. Trong liên kết cuối cùng, tác giả cố gắng đưa ra một lời giải thích rõ ràng, nhưng dù sao nó vẫn chưa rõ ràng.

A ở đây thể hiện đầu ra của tính toán, cũng là đầu vào để tiếp tục tính toán. B thể hiện kiểu trả về của sự tiếp tục đó, và C thể hiện kiểu trả về "cuối cùng" của nó - bởi vì shift có thể xử lý thêm về giá trị trả về và thay đổi kiểu của nó.

Tôi không hiểu sự khác biệt giữa "đầu ra của tính toán", "loại trả về của tiếp tục" và "loại trả về cuối cùng của tiếp tục". Họ âm thanh như từ đồng nghĩa.

+2

Tôi luôn buồn khi mọi người không xem được bài đăng trên blog của tôi: http://suereth.blogspot.com/2010/03/how-you-should-think-about-delimited.html I bao gồm chi tiết này, vì nó là một cái gì đó mà làm tôi thất vọng khi nhìn vào các nguồn hiện có trên internet. – jsuereth

+0

Cảm ơn Josh, tôi sẽ xem bài đăng của bạn. – jkff

Trả lời

20

Vì vậy, mọi người đã giúp tôi với điều này ở nơi khác. Dưới đây là câu trả lời:

reset ({ 
    ... 
    ...shift((k:A=>B) => ...::C)::A... 
    ... 
}::B)::C 

Vì vậy, shift là một lỗ kiểu A trong tính {...} loại B. Đối số của shift trả về giá trị loại C và đó là lý do tại sao reset ({...}) có loại C.

Bí quyết quan trọng trong việc hiểu công cụ này là thấy rằng {...}reset {...} có loại khác nhau tùy thuộc vào loại đối số trả về của shift.

Ví dụ:

reset ({ 
    "number "+shift((k:Int=>String) => List(k(1), k(2), k(3))) 
}) 

lợi nhuận List("number 1", "number 2", "number 3").

Đây AInt, BString, CList[String]{"number" + _} là (ở đây) là một chức năng Int-String và lập luận của shift, cho chức năng đó, tạo ra một List[String], mà sẽ trở thành kết quả của reset({...}).

+0

Giải thích rất tốt! – hotzen

1

Tôi vẫn đang trong quá trình tìm ra các quy tắc đánh máy/tác động chính xác liên quan đến ở đây.Có vẻ dễ dàng/dễ dàng hơn nếu các loại trong các ví dụ là "đơn giản đủ" để "vừa vặn" như được hiển thị ở trên, nhưng nó trở nên phức tạp hơn/khó khăn (ít nhất là đối với tôi) trong việc so sánh những thứ với cách gõ cho bởi tiark rompf:

|- e: [email protected][B,C]; {[|r|]}: U 
----------------------------------------------------- 
[|val x: A = e; r|] = [|e|].map((x: A) => {[|r|]}) 

nên kết quả của [|e|].map((x: A) => {[|r|]}) sẽ có các loại Shift[U,B,C] theo định nghĩa của bản đồ được đưa ra trong giấy tiark của.

Đây U là không nhất thiết phải giống như B.

Cho đến nay tôi không hiểu tại sao U được phép thể khác với B mà không cần một cái gì đó giống như U <: B đưa ra trong định nghĩa của bản đồ giấy tiark của.

Tôi thiếu thông tin gì để hiểu ở đây?

Mọi mẹo/ý tưởng?

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