Pregunta

Soy nuevo en ocaml y tratando de escribir una continuación pasando función de estilo pero bastante confundido cuál es el valor que necesito para pasar a la discusión adicional sobre los k

Por ejemplo, puedo escribir una función recursiva que devuelve verdadero si todos los elementos de la lista es aún, de lo contrario falso.

por lo que su gusto

let rec even list = .... 

en CPS, sé que necesito agregar un argumento de función de paso así como

let rec evenk list k = .... 

pero no tengo ni idea de cómo hacer frente a este k y cómo funciona esto exactamente el trabajo

, por ejemplo, para esta función, incluso, el medio ambiente se parece a

val evenk : int list -> (bool -> ’a) -> ’a = <fun>

evenk [4; 2; 12; 5; 6] (fun x -> x)  (* output should give false *)
¿Fue útil?

Solución

El k continuación es una función que toma el resultado de evenk y realiza "el resto del cálculo" y produce la "respuesta". Lo que escriba la respuesta tiene y lo que quiere decir con "el resto de la computación" depende de lo que utiliza CPS de . CPS en general, no es un fin en sí mismo, pero se hace con un propósito en mente. Por ejemplo, en forma de CPS es muy fácil de poner en práctica los operadores de control o llamadas a la cola optimizar. Sin saber lo que está tratando de lograr, es difícil responder a su pregunta.

Por lo que vale la pena, si simplemente está tratando de convertir de estilo directo a estilo de continuación que pasa, y lo único que importa es el valor de la respuesta, que pasa a la función identidad como la continuación está sobre la derecha.

Un buen siguiente paso sería implementar evenk utilizar CPS. Voy a hacer un ejemplo más simple. Si tengo la función de estilo directo

let muladd x i n = x + i * n

y si asumo primitivas CPS mulk y addk, me puede escribir

let muladdk x i n k =
  let k' product = addk x product k in
  mulk i n k'

y verá que el mulptiplication se hace primero, entonces se "continúa" con k', lo que lo hace el complemento, y, finalmente, que continues con k, que devuelve a la persona que llama. La idea clave es que dentro del cuerpo de muladdk I dieron una k' continuación fresca que se para un punto intermedio en la función de multiplicar-add. Para hacer su trabajo evenk tendrá que asignar por lo menos una tal continuación.

Espero que esto ayude.

Otros consejos

Siempre que he jugado con CPS, la cosa pasó a la continuación es justo lo que normalmente volver a la llamada. En este caso sencillo, un buen "lubricante de la intuición" es nombrar la continuación de "retorno".

let rec even list return =
  if List.length list = 0
    then return true
    else if List.hd list mod 2 = 1
      then return false
      else even (List.tl list) return;;

let id = fun x -> x;;

Ejemplo de uso: "incluso [2; 4; 6; 8] Identificación ;;"

Ya que tienes la invocación de evenk correcta (con la función identidad - convertir efectivamente la continuación de paso de estilo nuevo a estilo normal), supongo que es la dificultad en la definición de evenk

.

k es la función de continuación que representa el resto de la computación y la producción de un valor final, como dijo Norman. Por lo tanto, lo que hay que hacer es calcular el resultado de v de even y pasar el resultado a k, volviendo k v en lugar de sólo v.

Usted quiere dar como entrada el resultado de su función como si no estuviera escrito con el estilo que pasa continuación.

Aquí está su función que comprueba si una lista tiene sólo enteros pares:

(* val even_list : int list -> bool *)
let even_list input = List.for_all (fun x -> x mod 2=0) input

Ahora vamos a escribir con un cont continuación:

(* val evenk : int list -> (bool -> 'a) -> 'a *)
let evenk input cont =
  let result = even_list input in
  (cont result)

calcular el resultado de su función, y pasar resultto la consecuencia ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top