문제

값이 유형이있을 때 정확히 무엇을 의미하는지 이해하기 위해 고군분투하고 있습니다. A @cpsParam[B,C] 그리고 구분 된 연속 시설을 사용할 때이 양식의 어떤 유형이 내 값에 할당해야합니까?

나는 몇 가지 출처를 보았습니다.

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

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

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

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

그러나 그들은 이것에 대해 많은 직관을주지 않았습니다. 마지막 링크에서 저자는 명백한 설명을하려고하지만 어쨌든 충분히 명확하지 않습니다.

여기서 A는 계산의 출력을 나타내며, 이는 또한 연속에 대한 입력이기도합니다. B는 해당 연속의 리턴 유형을 나타내고 C는 "최종"리턴 유형을 나타냅니다. 바뀌는 것이 반환 된 값에 대한 추가 처리를 수행하고 유형을 변경할 수 있기 때문입니다.

"계산의 출력", "연속의 반환 유형"및 "연속의 최종 반환 유형"의 차이점을 이해하지 못합니다. 그들은 동의어처럼 들립니다.

도움이 되었습니까?

해결책

그래서 사람들은 다른 곳에서 나를 도와주었습니다. 다음은 답입니다.

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

그래서, shift 유형의 구멍입니다 A 계산에서 {...} 유형의 B. 의 주장 shift 유형 값을 반환합니다 C 그리고 그것이 이유입니다 reset ({...}) 유형이 있습니다 C.

이 물건을 이해하는 데있어 핵심 요령은 {...} 그리고 reset {...} 어떤 유형에 따라 다른 유형을 갖습니다 shift의 주장이 반환됩니다.

예를 들어:

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

보고 List("number 1", "number 2", "number 3").

여기 A ~이다 Int, B ~이다 String, C ~이다 List[String] 왜냐하면 {"number" + _} (여기) 기능입니다 Int 에게 String 그리고 논쟁 shift, 그 기능을 감안할 때 a List[String], 그것은 결과가된다 reset({...}).

다른 팁

나는 여전히 여기에 관련된 정확한 타이핑 규칙/시사점을 파악하는 과정에 있습니다.

예제의 유형이 위에 표시된 것처럼 "잘 맞는"것에 대해 "간단한"경우 쉽지 않은 것처럼 보이지만 Tiark Rompf의 타이핑과 타이핑과 비교하는 데있어서 더 간헐적으로/어려워집니다.

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

그래서 결과 [|e|].map( (x: A) => {[|r|]} ) 유형이 있습니다 Shift[U,B,C] Tiark의 논문에 주어진지도의 정의에 따르면.

여기서 당신은 반드시 B와 동일하지는 않습니다.

지금까지 나는 왜 당신이 같은 것없이 B와 다를 수 있는지 이해하지 못합니다.U <: B Tiark의 논문에서지도의 정의에 주어진.

여기서 이해하기에 실패한 것은 무엇입니까?

팁/아이디어가 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top