Skip to content

Commit d9dc1e6

Browse files
committed
Actualizada documentacion desfasada.
1 parent 5587eb5 commit d9dc1e6

File tree

8 files changed

+64
-374
lines changed

8 files changed

+64
-374
lines changed
Lines changed: 2 additions & 228 deletions
Original file line numberDiff line numberDiff line change
@@ -1,231 +1,5 @@
11
# Funciones
22

3-
## Estructura
3+
> En diseño
44
5-
```
6-
fun nombre param1 param2 =
7-
expr
8-
9-
nombre 10 20
10-
11-
// Funcion sin argumentos
12-
fun devolverHola () = "Hola"
13-
14-
const hola = devolverHola ()
15-
```
16-
17-
## Parámetros anotados
18-
19-
```
20-
fun nombreCompleto (nombre: string) (apellido: string) : Txt =
21-
nombre <> " " <> Apellido
22-
23-
fun sumarYConvertirAStr n1 n2 : Txt =
24-
(n1 <> n2).toString()
25-
26-
```
27-
28-
## Currying / Aplicación parcial
29-
30-
El currying será opcional debido a la forma en la que funcionan las funciones en JavaScript.
31-
Se usará un símbolo especial (por ejemplo `sumar# 10`)
32-
33-
```
34-
fun sumar x y z = x + y + z
35-
36-
const sumar10 = sumar# 10
37-
sumar10 20 30 //: 60
38-
39-
const sumar50 = sumar10# 40
40-
sumar50 -10 //: 40
41-
```
42-
43-
## Signatura
44-
45-
```
46-
// Num -> Num -> Num
47-
fun sumar x y = x + y
48-
49-
// (Num -> Num) -> Num
50-
fun aplicar f = f 10 + 20
51-
52-
// Txt -> (Txt -> Txt)
53-
fun imbuir saludo =
54-
fun saludar nombre =
55-
saludo <> " " <> nombre
56-
57-
saludar
58-
```
59-
60-
## Operadores
61-
62-
```
63-
fun (<>) s1 s2 = s1.concat s2
64-
65-
"Hola " <> "mundo" //= Hola mundo
66-
67-
fun (>*>) s1 s2 = s1.concat s2
68-
69-
"Hola " >*> "mundo" //= Hola mundo
70-
71-
// Notacion prefija
72-
(>*>) "Hola " "mundo" //= Hola mundo
73-
74-
// Currying
75-
const saludar = (>*>) "Hola "
76-
77-
saludar "Pedro" //= Hola Pedro
78-
saludar "Juan" //= Hola Juan
79-
80-
// Currying con operadores estilo Haskell
81-
const sumar2 = (+2)
82-
sumar2 10 //= 12
83-
84-
const saludar = ("Hola "<>)
85-
saludar "mundo" //= "Hola mundo"
86-
```
87-
88-
## Parametros opcionales
89-
90-
**_Ya que no hay currying automático, es posible cambiar esto._**
91-
92-
En sí, Kan no tiene parámetros opcionales. Para simular ese comportamiento
93-
se usa un tipo indefinido como parámetro.
94-
95-
```
96-
// Num -> Num? -> Num
97-
fun areaCuadrilatero base (altura: Num?) =
98-
// Re-definir altura
99-
const altura' = if altura? then altura else base
100-
101-
base * altura'
102-
103-
areaCuadrilatero 10 20 //= 200
104-
areaCuadrilatero 10 () //= 100
105-
```
106-
107-
## Parámetros por defecto
108-
109-
```
110-
// Num -> Num
111-
fun areaCirculo (radio = 1) = Math.PI * radio ** 2
112-
113-
areaCirculo 5 //= 78.539816...
114-
areaCirculo _ //= 3.141592...
115-
116-
117-
fun areaTriangulo (base = 1) altura =
118-
(base * altura) / 2
119-
120-
areaTriangulo 2 4 //: 4
121-
areaTriangulo _ 5 //: 2.5
122-
123-
// Con currying
124-
const f1 = areaTriangulo# _
125-
f1 5 //= 2.5
126-
f1 10 //= 5
127-
```
128-
129-
## Parámetros nombrados
130-
131-
```
132-
fun areaTriangulo base altura =
133-
(base * altura) / 2
134-
135-
areaTriangulo (~base = 10) 20 //= 100
136-
areaTriangulo (~base = 10) (~altura = 20) //= 100
137-
areaTriangulo (~altura = 20) (~base = 10) //= 100
138-
139-
areaTriangulo
140-
~base = 10
141-
~altura = 20
142-
143-
144-
// Tener nombres 'publicos' y nombres 'privados'
145-
fun areaTriangulo b~base h~altura =
146-
(b * h) / 2
147-
148-
areaTriangulo (~base = 10) 20
149-
areaTriangulo
150-
~base = 10
151-
20
152-
```
153-
154-
## Parametros en varias lineas
155-
156-
```
157-
fun saludar
158-
| s~saludo = "Hola"
159-
| n~nombre = ""
160-
| f~final = ""
161-
=
162-
console.log (s <> " " <> n <> f)
163-
164-
saludar "Bienvenido" "Pedro" "!" //= Bienvenido Pedro!
165-
saludar _ _ _ //= Hola
166-
saludar _ _ "!" //= Hola!
167-
```
168-
169-
## Funciones anonimas
170-
171-
```
172-
const funAnonima = fn x y -> x + y
173-
174-
const funAnonima: Num -> Num -> Num = fn x y -> x + y
175-
176-
const elevarAlCuadrado = fn (x: Num) -> x ** 2
177-
```
178-
179-
## Conductores
180-
181-
```
182-
console.log ("El resultado es " <> (10 + 20))
183-
184-
console.log <| "El resultado es " <> (10 + 20)
185-
186-
"El resultado es" <> (10 + 20) |> console.log
187-
```
188-
189-
## Composicion
190-
191-
```
192-
// ('A -> 'B) -> ('B -> 'C) -> ('A -> 'C)
193-
fun (>>) f g = fn x -> g (f x)
194-
195-
sea masDosPorDos = (+2) >> (*2)
196-
197-
masDosPorDos 10 //: 24
198-
masDosPorDos 23 //: 50
199-
200-
sea porDosMasDos = (*2) >> (+2)
201-
202-
porDosMasDos 10 //: 22
203-
porDosMasDos 23 //: 48
204-
205-
// Inverso
206-
// ('A -> 'B) -> ('C -> 'A) -> ('C -> 'B)
207-
fun (<<) f g = fn x -> f (g x)
208-
209-
sea porDosMasDos = (+2) << (*2)
210-
sea masDosPorDos = (*2) << (+2)
211-
```
212-
213-
## Funciones flecha
214-
215-
```
216-
// Para usar funciones flecha se usa una fun. anonima
217-
const funFlecha = fn x y => x + y
218-
```
219-
220-
## Rest/Spread
221-
222-
```
223-
fun imprimirNombres ...nombres =
224-
for (_, nombre) in nombres do
225-
console.log nombre
226-
227-
fun imprimirNumeros (...nums: [number]) =
228-
for (_, num) in nums do
229-
console.log num
230-
231-
```
5+
Ver los temas en la barra lateral.

public/textos/es/docs/next/funciones/aplicacion-parcial.md

Lines changed: 8 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
> En diseño
44
5-
A diferencia de otros lenguajes funcionales, KS no cuenta con currying automático,
5+
A diferencia de otros lenguajes funcionales, KS no cuenta con currying,
66
debido a que esto entra en conflicto con la semántica de JavaScript.
77

88
En JavaScript puedes llamar una función con con cualquier cantidad de parámetros,
@@ -23,78 +23,27 @@ Si quisieramos tener el mismo comportamiento en KS, tendriamos que saber la sign
2323
todas las funciones y exigir la cantidad exacta de parámetros. Lo primero es imposible y lo
2424
segundo limita las capacidades de JavaScript.
2525

26-
Por lo tanto, KS no cuenta con Currying, sin embargo, es posible aplicar parcialmente
26+
Por lo tanto, KS no cuenta con currying, sin embargo, es posible aplicar parcialmente
2727
una función de forma sencilla.
2828

29-
## Propuesta 1
29+
## Aplicación parcial
3030

3131
Un operador para aplicar parcialmente una función. Dada una función f con una cantidad desconocida
3232
de parámetros, se aplicaría parcialmente así:
3333

3434
```
35-
const nuevaFun = f* 1 2 3 4
35+
const nuevaFun = ~f 1 2 3 4
3636
```
3737

3838
Esto se compila a:
3939

4040
```javascript
41-
const nuevaFun = (...params) => f.call(undefined, 1, 2, 3, 4, ...params);
41+
const nuevaFun = (...params) => f.call(1, 2, 3, 4, ...params);
4242
```
4343

4444
## Signatura
4545

46-
En KS se usan flechas simples y dobles en la signatura, y ayudan a diferenciar
47-
los parámetros de una función.
46+
Debido a que la aplicación parcial es manual, la signatura de la función cambia.
4847

49-
Las flechas simples `->` indican parámetros, y la flecha doble `=>` indica el
50-
resultado de la función.
51-
52-
A continuación damos varios ejemplos de signaturas.
53-
54-
```
55-
f: number -> number => number
56-
```
57-
58-
f toma 2 parámetros de tipo number, y devuelve un number
59-
60-
```
61-
f: string -> number -> boolean => ()
62-
```
63-
64-
Toma como parámetros un string, un number, un boolean, y no devuelve nada.
65-
66-
```
67-
f: () => ()
68-
```
69-
70-
No toma ningun parámetro, y no devuelve nada.
71-
72-
```
73-
f: (string -> number -> Array => ()) => ()
74-
```
75-
76-
Toma 1 parámetro. Este parámetro es una función, y esta toma como parámetros:
77-
78-
- Un string
79-
- Un number
80-
- Un Array
81-
82-
y no devuelve nada. Finalmente, f no devuelve nada.
83-
84-
```
85-
compose: (string => number) -> (number => boolean) => (string => boolean)
86-
```
87-
88-
La función compose toma 2 funciones, y devuelve una nueva función.
89-
90-
- Función 1
91-
92-
Toma como parámetro un string y devuelve un number
93-
94-
- Función 2
95-
96-
Toma como parámetro un number y devuelve un boolean
97-
98-
- Función de retorno
99-
100-
Toma como parámetro un string y devuelve un boolean
48+
Si la función original es `number number -> number` y se aplica parcialmente el primer parámetro,
49+
la signatura de la última función será `number -> number`.

public/textos/es/docs/next/funciones/estructura.md

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ console.log(10 + 20); // 30
3636
Sin embargo, hacer algo parecido en KS da lugar a un error:
3737

3838
```err
39-
console.log 10 + 20 //! Error. El operador '+' trabaja con number.
39+
console.log 10 + 20 // NaN
4040
```
4141

4242
Esto se debe a que llamar a una función tiene una menor precedencia que usar un operador. En otras palabras,
@@ -56,9 +56,7 @@ console.log (10 + 20) // 30
5656

5757
## Funciones sin parámetros
5858

59-
Tecnicamente, en KS todas las funciones necesitan al menos 1 parámetro. Pero existe una forma de
60-
crear y llamar funciones 'sin parámetros'. Por ejemplo, la siguiente función imprime "Hola mundo" en
61-
la consola:
59+
Una función que no toma parámetros se define así:
6260

6361
```
6462
fun imprimirHolaMundo () =
@@ -71,14 +69,5 @@ imprimirHolaMundo ()
7169
Hola mundo
7270
```
7371

74-
En este ejemplo la función `imprimirHolaMundo` toma como primer parámetro una unidad `()`, y luego
75-
imprime el mensaje. Del mismo modo, al llamar la función pasamos como parámetro una unidad `()`.
76-
Esa unidad que se pasa como parámetro simplemente se ignora, creando una funcion 'que no toma parámetros'.
77-
78-
79-
80-
81-
82-
83-
72+
Al llamar a la función se coloca `()`.
8473

public/textos/es/docs/next/funciones/parametros-nombrados.md

Lines changed: 1 addition & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,26 +11,5 @@ parámetro:
1111
```
1212
fun sumar {dividendo, divisor} = dividendo / divisor
1313
14-
sumar {dividendo := 20, divisor := 5}
14+
sumar {dividendo 20, divisor 5}
1515
```
16-
17-
## Deprecado
18-
19-
Una sintaxis para tener parametros nombrados.
20-
21-
```
22-
fun dividir (x~dividendo) (y~divisor) = x / y
23-
24-
dividir (~dividendo = 20) (~divisor = 30)
25-
dividir (~divisor = 30) (~dividendo = 20)
26-
dividir
27-
~dividendo = 20
28-
~divisor = 30
29-
```
30-
31-
Deprecada por:
32-
33-
1. Hace uso del operador `~` de forma inconsistente, como operador binario y unario.
34-
2. Requiere que el programador aprenda una nueva sintáxis.
35-
3. Esta sintaxis requiere que el compilador sepa los nombres y orden de los parámetros.
36-
4. No funciona con JS existente.

0 commit comments

Comments
 (0)