Rodrigo Vidal F#, C#, CLR / Arquitetura e Desenvolvimento de Software

26jan/120

JavaScript – É ou não é igual?

Olá pessoal,

Continuando a série, sobre JS, vamos falar um pouco sobre dois operadores, extremamente simples. Eles são capazes de comparar dois valores e dizer se eles são iguais ou não. Realmente simples não? Provavelmente, você sabe muito bem, como isso funciona na sua linguagem server-side, ao comparar dois valores, dois arrays, ou até mesmo dois objetos. No entanto, olhando o código que já tive a oportunidade de observar nas empresas, percebo que os desenvolvedores não entendem muito bem como isso se dá no JavaScript. Então vamos entender de uma vez por todas, se é ou não é igual.

A primeira coisa a se saber é que Javascript possui dois operadores de igualdade! O que? Dois? É isso mesmo. Você provavelmente utiliza um deles com bastante frequência: O "==". Agora você pode pensar, nossa que obvio. Isso eu já sabia. Mas você realmente sabe como este operador funciona? Você conhece seu irmão menos brincalhão? O "===" ?

Não. Eu não errei o operador acima, realmente são 3 (três) "igual" seguidos. O desconhecimento deste segundo operador é a origem de muitos bugs estarem estourando por ai, sem você realmente entender o porquê, e geralmente não tão simples de entender, principalmente, se seu código não está cobertos por testes. Espera! Testes no Javascript? (Mas isso é tema pra outro post).

Os operadores == e === checam se dois valores são iguais mas com duas definições diferentes de igualdade. Ambos os operadores aceitam operandos de qualquer tipo, e ambos retornam true se os operando forem iguais e false se eles forem diferentes. O operador === é conhecido como operador de igualdade estrita, e checa quando os dois operandos são idênticos, usando uma definição mais estrita. O operador == é conhecido como operador de igualdade, ele checa quando os dois operador são iguais usando uma definição mais relaxada que permite conversões de tipo.

Javascript suporta os operadores =, ==, ===. Podemos lê-los da seguinte forma: "é atribuído para", "é igual a", "é estritamente igual a" respectivamente.

Os operadores != e !== testam para o oposto exato dos operadores == e ===.

Objetos no Javascript são comparados por referência e não por valor. Um objeto é igual a ele mesmo, mas diferente de qualquer outro objeto. Se dois objetos distintos tem o mesmo numero de propriedades, com os mesmo nomes e mesmo valores eles ainda assim não são iguais. Dois arrays com os mesmo elementos, na mesma ordem não são iguais uns aos outros.

Como funciona o ===

O operador === avalia os operandos e então os compara, sem realizar conversão de tipo, dada a seguinte regra:

  • Se os dois valores são de tipo diferentes, eles não são iguais.
  • Se os dois valores são null ou ambos são undefined, eles são iguais.
  • Se ambos os valores são o valor booleano true ou ambos são o valor booleano false, eles são iguais
  • Se um ou mais valores são NaN, eles não são iguais. O valor NaN não é nunca igual a nenhum valor, incluindo ele mesmo.
  • Se ambos os valores são números e tem o mesmo valor, eles são iguais; Se um valor é 0 e o outro -0 eles também são iguais.
  • Se ambos os valores são strings e contém exatamente os mesmos 16 bits, nas mesmas posições, então são iguais. Se as strings diferirem em tamanho ou posicionamento, não são iguais.
  • Se ambos os valores referirem para o mesmo objeto, array, ou função, eles são iguais. Se referem para objetos diferentes não são iguais, mesmo que ambos tenham propriedades idênticas.

Como funciona o ==

O operador == é menos estrito. Se os valores dos operandos não forem do mesmo tipo, ele tenta algumas conversões de tipo e realiza a comparação novamente.

  • Se os valores tem o mesmo tipo, ele testa para igualdade estrita, como descrito acima, Se os valores forem estritamente iguais, eles são iguais.

Se os dois valores não são do mesmo tipo, eles ainda podem ser considerados iguais:

  • Se um dos valores é null e o outro é undefined, eles são iguais.
  • Se um dos valores é um numero e o outro uma string, converte a string para um numero e tenta realizar a comparação novamente, usando o valor convertido.
  • Se um é true, converte para 1 e tenta a comparação novamente, Se um é false, converte para 0 e tenta novamente.
  • Se um valor é um objeto e o outro é um numero ou string converte o objeto para um primitivo e tenta novamente a comparação. Um objeto é convertido para um valor primitivo, usando o método toString() ou valueOf().
  • Qualquer outra combinação de valores não são iguais.

Ufa! Não tão simples não é mesmo?

Segue alguns exemplos práticos que tenta permear algumas das regras acima

// Operador === 

1 === "1"
>> false

null === null
>> true

undefined === undefined
>> true

true === true
>> true

false === false
>> true

NaN === 1
>> false

NaN === NaN
>> false

2 === 2
>> true

0 === -0
>> true

"js" === " js"
>> false

"js" === "js"
>> true

var o1 = {}
>> undefined

var o2 = {}
>> undefined

o1 === o2
>> false

var r1 = [1,2,3]
var r2 = [1,2,3]
>> undefined

r1 === r2
>> false

r1 === r1
>> true

//Operador ==

null == undefined
>> true

1 == "1"
>> true

1 == true
>> true

0 == false
>> true

var o = {}
>> o == "teste"

Por hoje é só!

Abraço! :D

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)
23jan/121

JavaScript – Tipos Primitivos e Revelações

Olá pessoal, tudo bem?

Vamos falar hoje sobre sobre a linguagem mandatória para escrever aplicações web. O Javascript. E quem não tem medo do Javascript? Até hoje vejo que muitos desenvolvedores não deram e ainda não dão importância, para esta linguagem. A maioria se limita a criar funções simples com outras funções logo abaixo em um código que beira o impossível de manter. Ou então se limita ao simples uso de plugins jQuery desenvolvidos por terceiros, para colocar uma calendário mais bonitinho na aplicação. Bom, já passou da hora de você saber que javascript é extremamente importante, e você deveria domina-la tanto quanto a linguagem server-side de preferência. Eu realmente espero que você domine está ultima. :)

Não pretendo aqui contar a historia do JavaScript, ou justificar, a razão de ela possuir alguns problemas comportamentais, o importante é que você aprenda a escrever um bom código e tenha produtividade, sem esbarrar em bugs inesperados.

Bom, precisamos mudar isso, portanto, vamos ver hoje os tipos primitivos.

Qualquer valor que você use pertence a um tipo. Em javascript existem os seguintes tipos primitivos:

  1. Number  - incluir números inteiros bem como de ponto flutuante.
  2. String - qualquer numero de caracteres, por exemplo "a", "ab", "ab e c".
  3. Boolean - assume apenas dois valores, true, ou false.
  4. Undefined - quando você tenta acessar uma variável que não existe, você recebe o valor especial undefined. O mesmo acontece para uma variável que ainda não foi inicializada. O javascript na verdade a inicializa para undefined por debaixo dos panos.
  5. Null - este é outro tipo especial que somente possui um valor, o valor null. Que significa, ausência de valor, vazio, ou nada. A diferença com undefined é que se uma variável tem o valor null, ela está definida, e só acontece quando é definida para null.

Qualquer valor que não pertença a nenhum dos 5 tipos primitivos listados acima é do tipo Object.
Então basta lembrarmos que em Javascript o tipo dos dados pode ser:

  • Primitivo (os 5 listados acima)
  • Não-Primitivo (object)

O operador typeof

Se você quer saber o tipo de uma variável ou de um valor, você pode utilizar o operador typeof. Este operador retorna uma string que representa o tipo do dado. Por exemplo o operador pode retornar "number", "string", "boolean", "undefined", "object". Vejamos alguns exemplos:

Números

//Inteiro
var n = 1234;
typeof n;
>> "number"

//Ponto Flutuante
var n = 1.23;
typeof n;
>> "number"

//Octal
var n = 0377;
typeof n;
>> "number"

//Hexa
var n = 0x00;
typeof n;
>> "number"

//Exponent
var n = 1e1;
typeof n;
>> "number"


Existem um valor especial em JavaScript chamado Infinity, veja bem, é um valor especial e não um tipo. Que representa como o próprio nome diz um valor Infinito, ou um valor que o JavaScript não consegue lidar.

typeof Infinity;
>> "number"

Mas como obter este valor especial Infinity, bom, podemos.

1e309;
>> Infinity

6/0;
>> Infinity

Bom, Infinity representa uma numero extremamente grande, e como representar um numero extremamente pequeno?

-1/0
>> -Infinity

Bonito não?

Existe ainda um outro tipo especial, quando estamos lidando com números! O valor NaN! Quem nunca o viu, que atire a primeira pedra :)

A primeira coisa que eu gosto de deixar claro sobre NaN é que ele é um numero! O que? Ahn? Isso mesmo! Veja..

typeof NaN;
>> "number"

Oh my God! Provavelmente foi isso que você exclamou ao ver este exemplo! Você obtém o valor NaN quando tenta realizar uma operação que seria realizada sobre  inteiros, mas esta operação falha. Ai você obtém como retorno este tipo especial. Simples não?

Vejamos alguns exemplos:

var a = 10 * "JavaScript";
a
>> NaN

1 + 2 + 3 + 4 + NaN;
>> NaN

Perfeito!

Strings

Como vocês sabem strings são uma sequencia de caracteres. Em Javascript qualquer valor colocado entre aspas simples OU duplas é uma considerado uma string. Vejamos alguns exemplos:  

typeof "1";
>> "string" 

typeof "texto";
>> "string" 

typeof 'texto';
>> "string" 

typeof "";
>> "string"

Conversões com String

Quando você usa uma string como uma operando em uma operação aritmética (com exceção da adição, veremos o porquê), a string é convertida em um numero por debaixo dos panos.

var s = 3 * '1';
>> 3
typeof s
>> "integer"

var t = 3 + '1'
>> "31"
typeof t
>> "string"

Como podemos ver caso o operador seja adição (+) o numero 3 é convertido para string por implicitamente e o resultado é uma string "31". Para qualquer outro operador a string seria convertida em um numero como no primeiro exemplo acima.

Caso a conversão implícita falhe o resultado, como não poderia deixar de ser, será NaN.

"texto" * 3;
>> NaN


Boolean

Bom como vimos existem apenas dois valores que percentem ao tipo Boolean, true e false;

var b = true;
typeof b;
>> "boolean"

var b = false;
typeof b;
>> "boolean"


Tudo convertido para boolean é true, com exceção dos seguintes 6 valores:

  1. ""
  2. null
  3. undefined
  4. 0
  5. NaN
  6. false


Undefined

Você recebe undefined como valor quando você tenta usar uma variável que não existe ou que ainda não foi inicializada

foo
>> foo is not defined

typeof foo
>> "undefined"

var x;
typeof x;
>> "undefined"

1 + undefined;
>> NaN

1 * undefined;
>> NaN

!!undefined
>> false

"" + undefined
>> "undefined"

Null

O valor null não é atribuído pelo Javascript pode debaixo dos panos, ele somente pode ter vindo de uma inicialização do seu código

var variável = null;
>> null
typeof variável
>> "object"

var i = 1 + null;
>> 1

1*null;
>> 0

Vemos que o valor null é considerado um objeto, o que pode parecer um pouco estranho, ter um objeto que é a representação de nada. Mas veremos mais sobre em futuros posts.

Bom por hoje era isso pessoal, espero ter desmistificado um pouco sobre os tipos primitivos no Javascript.

Abraço!

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)
10jan/122

Microsoft F# MVP

Olá pessoal, Feliz Ano Novo!

Bom.. o ano começa efetivamente para mim agora, no entanto quero compartilhar com vocês uma noticia que recebi no primeiro dia deste ano. Fui nomeado Most Valuable Professional pela Microsoft na competência Visual F#.

Não é necessário dizer tamanha minha felicidade por receber esta notícia. Venho acompanhando e estudando F# bem antes desta ter sido embarcada no Visual Studio em 2010, já em sua versão 2.0 e sou apaixonado por esta linguagem.

Espero aumentar muito mais meus trabalhos aqui no blog este ano, focando em linguagens funcionais. Veremos muito mais que F# por aqui. mvp_horizontal

No mais gostaria de agradecer alguns amigos que foram essenciais na minha trajetória, para chegar até aqui. @giovannibassi, @elemarjr, @diullei, @higorcesar. Claro que muitos outros também foram importantes, mas estes quatro foram peças-chave dentro da minha trajetória como profissional. Então meu muito obrigado à vocês amigos! :)

Bom.. vamos começar?

Então F#ca na Caveira!

Abraço,
Rodrigo Vidal

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)
27dez/110

F# – Estruturas de Dados Imutáveis [Lista ; Lista ; Lista]

Fala pessoal…

Dando continuidade ao post anterior, vamos hoje falar sobre uma estrutura extremamente importante para linguagens funcionais: Listas, e o que elas apresentam de tão diferente e marcante das estruturas de lista que conhecemos.

Se você está chegando agora confira também o post anterior onde falei sobre Tuplas aqui.

O Tipo Lista

Enquanto tuplas agrupam valores em uma unica entidade, listas permitem que você ligue os dados de maneira a formar uma corrente. Uma lista pode ser vazia ou composta por um elemento e uma outra lista. Um nome especial para representar essa lista vazia pode ser “nil” e para cada elemento “cons cell” de “constructed list cell”. Na imagem abaixo vemos a representação gráfica de uma lista.

Cada cons cell contém um único valor e uma referência para o próximo elemento da lista que pode ser uma nova cons cell ou uma lista vazia.

Vamos ver alguns exemplos de construção de listas:

let listaVazia = [] 
//val listaVazia : 'a list
 
let vogais = ["a";"e";"i";"o";"u"] 
//val vogais : string list = ["a"; "e"; "i"; "o"; "u"]
 
let numeros = [1;2;3;4;5;6] 
//val numeros : int list = [1; 2; 3; 4; 5; 6]]

O código acima é bem simples e acredito que não requeira explicação. Um ponto importante a notar é o mecanismo de inferência de tipo atuando novamente. No primeiro exemplo é construida uma lista vazia, e seu tipo é uma lista genérica. No segundo exemplo é construida uma lista de strings, e no terceiro uma lista de inteiros. É importante notar que todos os elementos de uma lista devem possuir o mesmo tipo, diferentemente das tuplas que vimos anteriormente que podem agregar diferentes tipos.

Operadores de Listas

Em F# são definidos alguns operadores básicos para tratarmos com listas. As listas do F# estão definidas no modulo FSharp.List . Vamos ver algumas facilidades agora.

List Ranges

Nos permite criar listas de maneira facilitada e de maneira menos verbosa.

let range = [1..10] 
//val range : int list = [1; 2; 3; 4; 5; 6; 7; 8; 9; 10]
let charRange = ['a'..'f'] 
//val charRange : char list = ['a'; 'b'; 'c'; 'd'; 'e'; 'f']

List Comprehensions

let prepost x = [ yield x-1; yield x; yield x+1] 
let result = prepost 10 
//val prepost : int -> int list 
//val result : int list = [9; 10; 11]

No exemplo acima criamos uma função chamada “prepost” que recebe um valor “x” e a partir disso cria uma lista com três valores, o antecessor, o proprio, e seu sucessor. Perceba que utilizamos a palavara chave yield, que em F# é o equivalente como você ja deve ter imaginando do nosso querido “yield return”.

let multiplesOf3 x = [for i in 1..10 -> x * i] 
let result = multiplesOf3 5 
//val multiplesOf3 : int -> int list
//val result : int list = [5; 10; 15; 20; 25; 30; 35; 40; 45; 50]

Já neste exemplo criamos uma função que gera dez multiplos do valor passado como parametro, e utilizamos a expressão “for .. in .. –> “. É válido dizer que isso nos permite criar lógicas interessantes para construção de listas.

O Operador Cons e Append

O operador cons é represtando por “::” na verdade é uma simplificação da função List.Cons, que coloca cada novo elemento como a nova “cabeça” da lista. O operador cons é associativo a direita, o que significa que ele compõe valores da direita para a esquerda.

let numeros2 = 1 :: 2 :: 3 :: 4 :: 5 :: 6 :: [] 
//val numeros2 : int list = [1; 2; 3; 4; 5; 6]
 
let impares = [1;3;5;7;9] 
let pares = [0;2;4;6;8]
let todos = pares @ impares 
//val todos : int list = [0; 2; 4; 6; 8; 1; 3; 5; 7; 9]

O operador append, representado por “@”  é uma simplificação para a função List.append que transforma duas listas em uma.

Algumas Funções do Módulo List

Duas funções importantissimas são a função List.head que retorna a “cabeça” da lista..

let head = List.head [1..10] 
//val head : int = 1

.. e a função List.tail que retorna a cauda da lista, ou seja, todos os elementos a partir da cabeça.

let tail = List.tail [1..10] 
//val tail : int list = [2; 3; 4; 5; 6; 7; 8; 9; 10]

Estas funções são essenciais quando estamos lidando com recursão e por isso resolvi apresentá-las aqui. Ja falamos bastante sobre como trabalhar com listas com F#, no entanto, o mais interessante ainda estar por vir. Você como um leitor atento deve ter reparado que estas listas não são as mesmas listas que acompanham o .NET Framework, ou as listas, que você está acostumado a utilizar com C# no namespace System.Collections.Generic, e o tipo List<>.

Mas então o que essas listas tem de diferente?

Listas Imutáveis

Uma lista ser imutável significa que nós podemos construir uma lista, nós não podemos pegar uma lista existente e modificá-la; nós não podemos adicionar ou remover um elemento. Funções que precisam adicionar novos elementos ou removê-los sempre retornarão uma nova lista sem modificar a original, porque modificar uma lista é simplesmente impossivel. Isso está de acordo com o conceito de nós eliminarmos efeitos colaterais e indesejados em funções que manipulam listas.

Seguindo o post sobre tuplas vou mostrar como seria de maneira simples uma Lista imutável em C#

public class FuncList<t>
{
    public bool IsEmpty { get; private set; }
    public T Head { get; private set; }
    public FuncList<t> Tail { get; private set; }
 
    public FuncList()
    {
        IsEmpty = true;
    }
 
    public FuncList(T head, FuncList<t> tail)
    {
        IsEmpty = false;
        Head = head;
        Tail = tail;
    }
}
 
public static class FuncList
{
    public static FuncList<t> Empty<t>()
    {
        return new FuncList<t>();
    }
 
    public static FuncList<t> Cons<t>(T head, FuncList<t> tail)
    {
        return new FuncList<t>(head, tail);
    }
}

A classe FuncList<T> é generica, então ela pode armazenar valores de qualquer tipo. Ela possui uma propriedade IsEmpty que é True quando nós criamos uma lista vazia pelo construtor sem parâmetro. O segundo construtor recebe dois argumentos, o primeiro é a cabeça da lista e o segundo é a lista que segue como cauda para o novo valor.
Ou seja o primeiro construtor equivale a lista vazia do F# [] e o segundo ao operador Cons “::”  do F#.

Agora como criar uma lista a partir desse novo tipo? Vemos abaixo:

var numbers = FuncList.Cons(1, FuncList.Cons(2, FuncList.Cons(3, FuncList.Empty<int>())));
//Equivalente em F#
//let numbers = 1 :: 2 :: 3 :: []

Agora vamos criar um método que calcule a soma de todos os elementos de uma lista formada de inteiros

public static int SumList(FuncList<int> numbers)
{
    return numbers.IsEmpty ? 0 : numbers.Head + SumList(numbers.Tail);
}
int sum = FuncList.SumList(numbers);

A função acima faz uso de recursão todos os elementos da lista. Caso a lista esteja vazia, retorna o valor zero, caso contrário retorna a cabeça + o resultado da função novamente sobre a cauda da lista, sucessivamente até encontrar como cauda apenas a lista vazia.

Bom pessoal, por hoje era isso! Smiley de boca aberta

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)
5dez/110

F# – Estruturas de Dados Imutáveis (Tupla, Tupla)

Fala pessoal..

Hoje vamos falar sobre estruturas de dados imutáveis e o que isso quer dizer, e aproveitarei para mostrar como funcionam tuplas em F# e como seria uma implementação para Tuplas no C#.

Uma estrutura de dados imutável é uma estrutura em que o valor não muda após sua criação. Quando você declara uma estrutura que contém campos por exemplo, estes também devem ser imutáveis.

O Tipo Tupla

A estrutura mais simples em F# e o tipo Tupla. Tupla é uma estrutura simples capaz de agrupar elementos de diferentes tipos. O exemplo a seguir mostra como criar uma tupla que possui dois elementos agrupados:

let tp = (“O número é”, 42)


Como podemos ver criar uma tupla em F# é extremamente simples, nós escrevemos uma lista separada por virgulas dentro de parênteses. Mas vamos olhar com mais detalhes. O mecanismo de inferência de tipo da linguagem foi utilizado aqui, então você não precisa explicitamente dizer o tipo de sua tupla. O compilador infere que o primeiro elemento da sua tupla é uma string e o segundo é um inteiro, então podemos ler como: uma tupla que contem uma string como seu primeiro valor e um inteiro como seu segundo valor. Como podemos notar o valor de tp é do tipo string * int. Esta é a forma como é representado esta tupla, em F#.

Operações com Tuplas

Vamos começar a usar algumas operações com tuplas.

let mostrar tupla = 
	printfn "O primeiro elemento é %s e o segundo é %d" (fst tupla) (snd tupla)
 
do mostrar ("X", 7)


Neste exemplo criamos uma função chamada mostrar que recebe como parâmetro uma tupla. Nesta definição usamos a função printfn (que eu acredito que não precise de comentários) e passamos como argumento o primeiro e o segundo elemento da tupla. fst e snd são definidos como operadores em FSharp.Core.Operators e retornam o primeiro e o segundo elemento da tupla respectivamente (é uma referencia para First e Second).

Se analisarmos a função mostrar ela tem a seguinte definição (string * int –> unit). Ou seja ela recebe uma tupla de string e inteiro e retorna unit. Unit é um tipo do F# que indica que a função não retorna valor. Vemos que novamente o mecanismo de inferência de tipo entrou em cena, no entanto como pôde saber qual o tipo da tupla com que esta função sabe trabalhar? A resposta esta na string passada para a função printfn, o %s indica string e o %d indica um inteiro. A partir dai o compilador consegue inferir que estes são os tipos esperados pela função e a definição da tupla.

Tupla é uma estrutura imutável, ou seja, não podemos alterar o valor de um elemento da tupla, uma vez que a tupla tenha sido criada. Para alterarmos esse valor é necessário criar uma nova tupla. Vamos ver abaixo uma função que realiza essa operação.

let tuplaComNovoValor novoValor tupla = 
	let (original1, original2) = tupla 
	(novoValor, original2)


Definimos a função tuplaComNovoValor que cria uma nova tupla alterando o valor do primeiro item. Isso é necessário pois como dissemos anteriormente, a estrutura tupla é imutável, para modifica-la somente criando outra com seus novos valores.

Implementando um tipo Tupla em C#

Como sabemos no .NET 4 foi inserido um tipo Tuple<> genérico, que nos permite trabalhar de forma semelhante ao que fizemos com F#. No entanto meu objetivo aqui é mostrar de maneira mais simples como esse tipo foi/poderia ter sido implementado.

public sealed class Tuple<T1, T2>
{
	private readonly T1 item1;
	private readonly T2 item2;
 
	public T1 Item1
	{
		get { return item1; }
	}
 
	public T2 Item2
	{
		get { return item2; }
	}
 
	public Tuple(T1 item1, T2 item2)
	{
		this.item1 = item1;
		this.item2 = item2;
	}
 
}

O que há de mais notável neste tipo é que ele é imutável. De maneira simples, nós marcamos todos os campos com o modificador readonly e provemos apenas propriedade do tipo Get. Campos somente leitura só podem ter valores atribuídos no construtor, o que significa que uma vez criada, seu estado interno não pode ser alterado, ou mutado, assim como seus valores armazenados internamente também são imutáveis.

Implementando a mesma Tupla em F#

    type Tuple<'T1,'T2> =  
        new : 'T1 * 'T2 -> Tuple<'T1,'T2>
        member Item1 : 'T1 with get
        member Item2 : 'T2 with get


É claro que muito da implementação foi suprimida, pois não é do interesse deste post. Mas é o suficiente para expor o conceito apresentado.

Como podemos ver é muito simples trabalhar com Tuplas no F#. Em C# este trabalho se torna mais verboso, pois o mecanismo de inferência de tipo ainda não é tão poderoso.

Por hoje era isso pessoal!

Abraço!

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)
19nov/110

Encontro DNA Rio de Janeiro – 19/11/2011

Fala pessoal tudo bem?

Hoje aconteceu mais um encontro do .NETArchitects Rio de Janeiro. Foi um dia excelente e de casa cheia. Muita galera nova, e membros que não apareciam a algum tempo também voltaram. Parabéns para a comunidade carioca.

Para quem não foi, na parte da manhã tivemos uma mesa redonda sobre diversos assuntos e almoçamos no Spoleto.
Na parte da tarde o @DanielSilvaRj deu um verdadeiro Workshop sobre RavenDB, onde vimos implementação, demos uma hackeada no Raven e vimos como ele é uma solução interessante. Por fim o @JuanPLopes programou um algoritmo de ordenação topologica que pode ser encontrado aqui https://gist.github.com/1379161.

Segue uma foto da galera!

IMG_0263

Valeu a todos que compareceram, foi show!

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)
14nov/111

Programação Funcional – Expressions ao invés de Statements

Olá pessoal tudo bem?

Vou falar um pouco hoje sobre mais uma característica de programação funcional e presente na linguagem F#.

Em linguagens imperativas uma expressão é simplesmente um pedaço de código que pode ser avaliado e retorna uma resultado. Então a invocação de um método ou o uso de qualquer operador booleano ou inteiro é uma expressão. Um “statement” é uma pedaço de código que afeta o estado do programa e que não possui um resultado ou um retorno. Um chamada para um método oque não retorna nenhum valor é um statement, porque ele afeta o estado do programa.

Uma atribuição também muda o estado, alterando o valor de uma variável, mas em sua versão simples, não retorna nenhum valor, logo é um statement.

Outro exemplo típico de statement é mudar o fluxo de uma função usando a keyword “return”, ou até mesmo sair de um loop usando “break”. Ambos não possuem valor de retorno, ao invés disso, seu único proposito é mudar o estado do programa

Como você sabe, em linguagens funcionais o estado é representado pelo o que a função retorna e a única maneira de se modificar estado é retornando o valor modificado. Seguindo está logica, em linguagens funções tudo é interpretado como uma expressão com um valor de retorno. As consequências podem ser demonstradas com o seguinte exemplo

Imagine que queremos somar números de um valor a outro:

Este código muda estado de variáveis e usa quatro Statements para resolver o problema

Este código no entanto apesar de usar Recursão (que é preferível em prog. func.) não é funcional por esta escrito como uma serie de três Statements.

O que nós podemos fazer para mudar isso para uma versão mais funcional seria usar o operador ( ?: ) do C#. Com esta forma de construção nós podemos reescrever o corpo como uma única expressão que é mais próximo de como linguagens funcionais tratam todo código válido.

Como podem ver todo o corpo do método é uma expressão única que retorna um valor. Em C# isso significa que o método deveria começar com return. E nós também não poderíamos usar return e nenhum outro lugar. Em C# if-then-else é um Statement, já em F# é uma Expressão. Note que são abordagens diferentes, e linguagens funcionais utilizam Expressions em detrimento de Statements.

Por hoje era isso pessoal!

Abraço!

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)
8nov/110

F# – Project Euler #2

Olá pessoal,

Estou caminhando com alguns problemas do Project Euler (mais lento do que eu gostaria), mas vamos lá. Desta vez resolvi o problema 2.

O Problema

Cada novo termo da Sequencia de Fibonacci é gerado somando os dois termos anteriores. Começando por 1 e 2, os primeiros 10 termos seriam: 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

Considerando os termos da Sequencia de Fibonacci cujos valores não excedam 4 milhões encontre a soma dos termos pares.

A Solução

Reparem que a solução é bem declarativa e simples.

Na linha 1 temos a definição do valor Fibonacci que não recebe nenhum parâmetro e retorna um inteiro. Podemos notar que nada disso foi informado no nosso código, no entanto o compilador consegue inferir o tipo da função baseado nas linhas seguintes.

Na linha 2 temos uma tupla (0,1), (muito elegante essa definição de Tuplas não?) que serve como estado inicial para nossa função Seq.unfold.

Na linha 3 temos o operador pipe-forward (|>) que como expliquei em um post anterior está usando nossa tupla e passando para a função Seq.unfold como ultimo parâmetro desta função. 

A função unfold está definida no modulo Seq, e é responsavel por gerar todos os números das serie de Fibonacci. Vamos analisar sua assinatura para podemos entender melhor o que essa função faz:

(‘State –> (‘T * ‘State) option) –>  ‘State –> seq<’T>

Uau! Agora ficou complexo hein! Bom percebi que ainda não expliquei em um blog post como ler esse tipo de assinatura, e ela trata de um elemento que também ainda não comentei por aqui. Como são assuntos extensos vou tratar em posts em seguida.

Mas então como podemos entender a função unfold?

Vamos tentar entender o seguinte: a função unfold recebe como segundo parâmetro um estado inicial, no nosso caso a tupla (0,1) e recebe como primeiro parâmetro uma função. Esta função recebe como parâmetro um estado inicial e retorna uma tupla de dois elementos. O primeiro elemento é do tipo inteiro, e o seguindo é do tipo tupla (também de dois elementos.

Com isso a função unfold consegue gerar toda a serie de Fibonacci. O tipo seq retornado é Lazy, então temos essa sequencia “infinita” sem problemas.

Na linha 4 temos uma função chamada takeWhile que recebe como parâmetro uma lambda function que é o equivalente a uma lambda expression no C#. Esta é denotada pela keyword fun. Essa keyword está filtrando os elementos abaixo de 4 milhões. toda vez que um novo estado é retornado, ele verifica esse pressuposto, caso atenda ele compõe a nova sequencia.

Na linha 5 já com a sequencia abaixo de 4 milhões filtramos todos números pares, usando a função filter e passando também uma lambda função como parâmetro.

Na linha 6 somamos todos os elementos da sequencia.

Com isso sabemos porque o compilador do F# consegue saber o tipo do valor Fibonacci. O resultado final retornado da função é do tipo inteiro, porque a função Seq.sum retorna um inteiro, uma vez que nossa sequencia é composta por inteiros.

Por hoje é isso pessoal.

Abraço!

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)
21out/110

Palestra – F# 3, C# 5, VB 11 e Futuro das Linguagens

Olá pessoal tudo bem?

Hoje realizei duas palestras sobre o futuro da plataforma de desenvolvimento da Microsoft, falando sobre as novas versões da linguagens F#, C# e VB na Estácio da Praça XI.

A primeira parte foi mais basica e para um público mais iniciante. A segunda parte contou com um publico mais experiente e pude aprofundara mais nos conceitos. Foi muito bom estar em contato com esse galera. O feedback foi extremamente positivo.

Abaixo segue os slides da palestra.. caso você tenha participado.. conto com seu feedback nos comentários. Os slides utilizados são um subset dos utilizados pelo Anders Hejlsberg no Build11.

Por hoje era isso pessoal..

Abraço,
Rodrigo Vidal

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)
20out/110

F# – Submeta Idéias e Vote

VOZ DO POVOOlá pessoal, você pode contribuir para linguagem F# e outros produtos relacionados ao Visual Studio, dando sugestões e votando nas melhorias.

http://visualstudio.uservoice.com/forums/121579-visual-studio/category/30935-languages-f-

A comunidade F# tem votado bastante para melhorias principalmente na IDE, e caracteristicas como Type Classes, “Compiler as a Service”, e extensibilidade do compilador através de uma linguagem integrada como na linguagem Boo.

Por enquanto é só,

Abraço,
Rodrigo Vidal

Digg This
Reddit This
Stumble Now!
Buzz This
Vote on DZone
Share on Facebook
Bookmark this on Delicious
Kick It on DotNetKicks.com
Shout it
Share on LinkedIn
Bookmark this on Technorati
Post on Twitter
Google Buzz (aka. Google Reader)