Está en la página 1de 4

(24294) Diseño Funcional de Programas

2019-2020
Profesores: Fabio Ortega, Sergio Giraldo, Toni Lunar

Seminario 5

1. Indique los cuatro primeros elementos de cada flujo programado con “thunks”:

datatype 'a stream = Stream of 'a * (unit -> 'a stream)

fun head (Stream (a,b)) = a


fun tail (Stream (a,b)) = b()

a) val a =
let
fun gen x = Stream (x, fn () => gen (x+x))
in
gen 1
end

b) val b =
let
fun gen (a,b) = Stream (a, fn () => gen (a+b,a))
in
gen (1,0)
end

c) val c =
let
fun gen pr =
Stream (hd pr, fn () => gen (tl pr@[hd pr]))
in
gen [8,5]
end

d) val d =
let
fun gen x y = Stream (if x = y then 1 else 0,
fn () => gen ((x+1) mod 2) ((y+1) mod 3))
in
gen 1 2
end
2. Cambie las funciones a continuation passing style. Incluya todas las declaraciones
de tipos:

a) fun max (x:int) (y:int):int = if x > y then x else y

b) fun concat (l:string list):string =


if null l then ""
else (hd l) ^ (concat (tl l))

c) fun composeN 1 f x = f x
| composeN n f x = composeN (n-1) f (f x)

3. Usando la implementación de flujo del ej. 1, escriba una stream que produzca la
secuencia [3, ~9, 27, ~81, …].

4. Usando la implementación de flujo del ej. 1, escriba una stream que produzca la
secuencia [0,1,1,0,2,2,0,3,3,0,4,4,…].
5. Indique el resultado de cada expresión:

fun return x = SOME x


fun bind x f = if isSome(x) then f (valOf x) else NONE

fun k x =
let
val aux = (x - 10) * x
in
if aux < 0 then NONE else SOME aux
end

a) val a = return 11 a = ___________

b) val b = bind a k b = ___________

c) val c = bind b k c = ___________

d) val d = bind (return 9) k d = ___________

e) val e = bind d k e = ___________

6. Considere la función:

fun addlater x y = fn () =>


let val _ = print ("added " ^ (Int.toString x) ^
" and " ^ (Int.toString y) ^ "\n")
in x + y end

a) Use addlater repetidamente para calcular 1 + 2 + 3 + 4 + 5.

b) Cuál es el tipo de la función addlater?

c) Complete la implementación de monad de manera que la expresión pueda ser


calculada con bind:

fun return x = fn () => x


fun bind x f = fn () => (___(x())) ____
val answer = (addlater 1 2)
val answer = bind (answer) (addlater 3)
val answer = bind (answer) (addlater 4)
val answer = bind (answer) (addlater 5)

e) Escriba la función multlater para que produzca el tipo de la


monad unit -> int.

fun mult x y = x * y

fun multlater x y =

e) Use addlater y multlater con bind para calcular (4 + 5) * 3.

También podría gustarte