Я изо всех сил пытаюсь понять то, что точно делает это означает, когда значение имеет тип 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-explained-in.html
http://blog.richdougherty.com/2009/02/delimited-continuations-in-scala_24.html
но они не дали мне много интуиции в это. В последней ссылке автор пытается дать явное объяснение, но это не достаточно ясно так или иначе.
Здесь представляет вывод вычисления, которое является также входом к его продолжению. B представляет тип возврата того продолжения, и C представляет свой "заключительный" тип возврата — потому что сдвиг может сделать последующую обработку к возвращенному значению и изменить его тип.
Я не понимаю различия между "выводом вычисления", "возвращают тип продолжения" и "заключительный тип возврата продолжения". Они походят на синонимы.
Итак, люди помогли мне с этим. в другом месте. Вот ответ:
reset ({
...
...shift((k:A=>B) => ...::C)::A...
...
}::B)::C
Итак, shift
- это дыра типа A
в вычислении {...}
типа B
. Аргумент shift
возвращает значение типа C
, поэтому reset ({...})
имеет тип C
.
Ключевой трюк в понимании этого материала заключался в том, чтобы увидеть, что {...}
и reset {...}
имеют разный тип в зависимости от того, какой тип сдвига Аргумент
возвращается.
Например:
reset ({
"number "+shift((k:Int=>String) => List(k(1), k(2), k(3)))
})
возвращает Список («номер 1», «номер 2», «номер 3»)
.
Здесь A
- Int
, B
- String
, C
- List [String] ]
, потому что {"число" + _}
является (здесь) функцией от Int
до String
и аргументом shift
] с учетом этой функции создает список List [String]
, который становится результатом сброса ({...})
.