Herramientas de usuario

Herramientas del sitio


functional:fsharp

Diferencias

Muestra las diferencias entre dos versiones de la página.

Enlace a la vista de comparación

Ambos lados, revisión anterior Revisión previa
Próxima revisión
Revisión previa
functional:fsharp [2011/01/27 16:29]
alfred
functional:fsharp [2020/05/09 09:25] (actual)
Línea 42: Línea 42:
  
  
-==== Tipos de datos y operaciones ====+ 
 + 
 + 
 + 
 + 
 + 
 +===== Tipos de datos y operaciones ​=====
 Los datos en F# no se asignan sino que se enlazan. Esto significa que al hacer: Los datos en F# no se asignan sino que se enlazan. Esto significa que al hacer:
 <​code>​ <​code>​
Línea 69: Línea 75:
 </​code>​ </​code>​
  
-=== Numéricos ===+ 
 +==== Numéricos ​====
 Un número, como por ejemplo 100, es interpretado como un integer de 32 bits, si queremos que sea un short escribiríamos 100s. Los tipos de datos que existen son: Un número, como por ejemplo 100, es interpretado como un integer de 32 bits, si queremos que sea un short escribiríamos 100s. Los tipos de datos que existen son:
 {{ functional:​fsharp:​numeric_data_types.png |}} {{ functional:​fsharp:​numeric_data_types.png |}}
Línea 76: Línea 83:
   - Octal: un cero seguido de una '​o'​ minúscula: ''​0o103''​.   - Octal: un cero seguido de una '​o'​ minúscula: ''​0o103''​.
   - Binario: un cero seguido de una '​b':​ ''​0b1001''​.   - Binario: un cero seguido de una '​b':​ ''​0b1001''​.
 +Podemos definir unidades de medida:
 +<​code>​
 +[<​Measure>​] type  m   (* meters *)
 +[<​Measure>​] type s   (* seconds *)
 +
 +> let distance = 123.5<​m> ​               // using meters ​          
 +- let time = 5.0<​s> ​                     // using seconds
 +- let speed = distance / time;; ​         // mixing units
 +val distance : float<​m>​ = 123.5
 +val time : float<​s>​ = 5.0
 +val speed : float<​m/​s>​ = 24.7
 +</​code>​
 +//F# PowerPack (FSharp.PowerPack.dll)//​ es una librería de Microsoft con medidas predefinidas.
 +
 +==== Strings ====
 +Para definir strings:
 +<​code>​
 +let daughter = "​Melissa"​
 +let pet = "​Sugar"​
 +</​code>​
 +Podemos hacer strings multi-línea:​
 +<​code>​
 +let haiku = "No sky
 +no earth - but still
 +snowflakes fall"
 +</​code>​
 +O strings de una sóla línea en múltiples acabando estas en \ :
 +<​code>​
 +let haiku = "No sky\
 +no earth - but still\
 +snowflakes fall"
 +</​code>​
 +Podemos acceder a los carácteres:​
 +<​code>​
 +let daughter = "​kimberly" ​ // string
 +let first = daughter.[0] ​  // first character, '​k'​
 +let last = daughter.[7] ​   // last character, '​y'​
 +</​code>​
 +O convertir el string a bytes:
 +<​code>​
 +> let countryBytes = "​USA"​B
 +val countryBytes : byte array = [|85uy; 83uy; 65uy|]
 +</​code>​
 +Existen varias operaciones que podemos hacer con un string:
 +<​code>​
 +let fullname = "Mary "+ "​Smith" ​         // concatenation
 +let s = "hello " + string 100            // concatenation,​ string conversion operator
 +let len = fullname.Length ​               // 10
 +let i = fullname.StartsWith("​Mary"​) ​     // true
 +</​code>​
 +También podemos construir strings largos utilizando ''​StringBuilder'':​
 +<​code>​
 +let buf = new System.Text.StringBuilder()
 +buf.Append("​Mary had ")
 +buf.Append("​a little lamb, it's ")
 +buf.Append("​(you know the rest...)"​)
 +</​code>​
 +
 +
 +==== Condicionales ====
 +Existe el tipo de dato boolean:
 +<​code>​
 +let t = true        // true
 +let f = false       // false
 +let x = t && f      // false
 +let y = t || f      // true
 +let fls = not true  // false
 +</​code>​
 +Para evaluarlo, como en otros lenguajes, utilizamos los if's. Hemos de tener en cuenta que en F# no existe el ''<​nowiki>​==</​nowiki>''​ sino el ''​=''​ para hacer comparaciones de igual. \\ 
 +En F# el if devuelve una expresión que es asignable a una variable:
 +<​code>​
 +let name, pin = "​bob",​ 123
 +let securityMessage =
 +    if name = "​bob"​ && pin = 123 then "​welcome bob!"
 +    elif name = "​sally"​ && pin = 456 then "​welcome sally!"​
 +    else "​access denied"​
 +
 +let name = "​bob"​
 +let s =
 +    if name="​bob"​ then
 +        printfn "bob is a palindrome"​
 +        "bob backwards is still bob"
 +    else
 +        printfn "​access denied"​
 +        "who are you?"
 +</​code>​
 +Para no asignar un if llamaremos a ''​ignore''​ que recibe una expresión y la obvia:
 +<​code>​
 +let a, b = 100, 200
 +(if a < b then "a < b" else "a is not less than b") |> ignore
 +</​code>​
 +Los if's son expresiones que evaluan como ''​unit''​.
 +
 +==== Bucles ====
 +Los bucles son expresiones que evaluan como ''​unit''​.
 +=== for..do ===
 +<​code>​
 +for i = 1 to 10 do
 +    printfn "i = %d" i
 +
 +// Count from 1 to 10, with identifiers
 +let a, b = 1, 10
 +for k = a to b do
 +    printfn "k = %d" k
 +
 +// Count down from 10 (down) to 1
 +for j = 10 downto 1 do
 +    printfn "j = %d" j
 +
 +// Sum the first 5 non-zero integers.
 +// This is quite "​imperative."​ We'll see its functional cousin later.
 +let mutable sum = 0
 +for n = 1 to 5 do
 +    sum <- sum + n
 +    printfn "​current sum = %d" sum
 +</​code>​
 +=== while ===
 +<​code>​
 +// Output numbers from 1-10 and squares
 +let mutable n = 1
 +while n <= 10 do
 +    let sq = n * n
 +    printfn "%d %d" n sq
 +    n <- n + 1
 +
 +// Note mutable applies to both identifiers below
 +let mutable a, b = 1, 10
 +while b > a do
 +    printfn "%d %d" a b
 +    a <- a + 1
 +    b <- b - 1
 +
 +// Using parentheses and Boolean conjuction  ​
 +let mutable a, b, c = 1, 10, 0
 +while ((a < b) && (c < 3)) do
 +    printfn "%d %d %d" a b c
 +    c <- c + 2
 +</​code>​
 +
 ===== Notas ===== ===== Notas =====
   * ''​printfn''​ funciona igual que String.Format:​   * ''​printfn''​ funciona igual que String.Format:​
functional/fsharp.1296145789.txt.gz · Última modificación: 2020/05/09 09:24 (editor externo)