Я пытаюсь преобразовать некоторые функции в CPS в Scala, используя примеры, которые я нашел в Интернете на других языках.
У нас была только одна лекция по CPS, и все должно быть очень просто, но все же я не совсем понимаю, как правильно выполнять преобразования.
Это примеры, которые я нашел в Интернете, и я пытаюсь сделать это в Scala.
pow2' :: Float -> (Float -> a) -> a
pow2' a cont = cont (a ** 2)
add' :: Float -> Float -> (Float -> a) -> a
add' a b cont = cont (a + b)
sqrt' :: Float -> ((Float -> a) -> a)
sqrt' a = \cont -> cont (sqrt a)
pyth' :: Float -> Float -> (Float -> a) -> a
pyth' a b cont = pow2' a (\a2 -> pow2' b (\b2 -> add' a2 b2 (\anb -> sqrt' anb cont)))
Теперь я начал с pow2 ', который выглядит так:
def pow2_k(a:Float, k:(Float => Float)) : Float =
(a*a)
def pow2_cont(n: Float) = pow2_k(n, (x: Float) => x)
Сначала у меня было k(a*a)
вместо простого (a*a)
, что привело к странным результатам.
Затем я попытался добавить ', который на данный момент выглядит следующим образом:
def add_k(a:Float, b:Float, k:(Float, Float => Float)) : Float =
(a+b)
def add_k_cont(n:Float,m:Float) = add_k(n,m (x: Float, y:Float => (n+m)))
Это явно неправильно. У меня проблемы с написанием правильного продолжения.
Кто-нибудь знает хороший сайт, бумагу, видео и т. Д., Который объясняет преобразование CPS и продолжения? Большинство из найденных мной либо слишком короткие и без примеров, либо слишком сложные. Я чувствую, что это не так сложно для этих простых функций, которые я пытаюсь преобразовать ...
Спасибо.