Wednesday, February 15, 2006

Um pouco de Haskell[REPOST]

A pedidos de um amigo, taí:

Haskell é uma linguagem funcional, toda escrita baseada em funções.Conta com uma biblioteca padrão,chamada Prelude, que contém algumas funções básicas como raiz quadrada(sqrt), e funções para manipulações de listas.

Exemplo de sintaxe de uma função:

média aritimética entre dois nums:

media::Float->Float->Float

media x y = (x+y)/2.0

onde media é o nome da função(em minúscula),os 2 primeiros Float são as 2 entradas,e o último Float é a saída(resultado).

Para sua execução o exemplo deve ser salvo por um Editor de Textos com a extensão .HS e ser executado pelo interpretador hugs,q pode ser baixado em haskell.org . Exemplo de execução via prompt:

media 8.0 e 9.0 --retornará 8.5

Para saber mais:

http://cs.wwc.edu/~cs_dept/KU/PR/Haskell.html

http://www.marcosrodrigues6.hpg.ig.com.br/cap2.htm


E aqui vai um Script com algumas funções(salvar como testes.hs , por exemplo):

--Teste de funções em Haskell-16/12/2004-Por Ironlynx(c)
--cubo de um número
cubo::Int->Int
cubo c= c*c*c

--cubo de n nums-outra forma
saidacubo=[3^n|n<-[0..15]]

--exemplo de tabuada
tabuada=[5*n|n<-[1..9]] --tabuada de 5

--exponencial
exponencial::Int->Int->Int
exponencial b e
| e==0=1
| e==1=b
| otherwise =b*exponencial b (e-1)

--fatorial
fat::Int->Int
fat n
| n==0=1
| otherwise =n*fat(n-1)
--a função product substitui o uso de fatorial exemplo:
produto::Int
produto=product[1..10]

--Sequencia de Fibonnacci-inicia em 0 e 1 e cada num q se segue é a soma
--dos 2 anteriores
fibo::Int->Int
fibo n
| n==0=0
| n==1=1
| otherwise =fibo(n-1)+fibo(n-2)--melhor usar n>1pois negativos darão erro!

--diagonal de um paralelepípedo de lados a,b e c
diagonal::Float->Float->Float->Float
diagonal a b c =sqrt(a*a+b*b+c*c)

--Equação do 2º(ax^2+bx-c=0)--
equacao::Float->Float->Float->[Float] --produz um resultado do tipo lista
equacao a b c=[bmais a b c,bmenos a b c]
bmais::Float->Float->Float->Float
bmais a b c = (-b + sqrt(delta a b c))/(2*a)
bmenos::Float->Float->Float->Float
bmenos a b c = (-b + sqrt(delta a b c))/(2*a)
delta::Float->Float->Float->Float
delta a b c = (b^2)-(4*a*c)

--escrever numeros de 1 a 10-usando uma lista
numers::[Int]
numers=[1..10]

--imprimir os numeros entre 2 valores dados(inferior e superior) de acordo
--com o passo escolhido pelo usuário-por exemplo: valores 2 20 4
--exibirá a lista [2,6,10,14,18]
valores::Int->Int->Int->[Int]
valores inf sup passo=[inf,(inf+passo)..sup]

--implementando funções mod(retorna o resto) e div(retorna o quociente)
--já existem no prelude---->é apenas um exercício
funcaomod::Int->Int->Int
funcaomod x y
| (x-y)>=y=funcaomod (x-y) y
| (x==y)=0
| (x>y)=x-y

--funcaodiv::Int->Int->Int
--funcaodiv x y = (x - funcaomod x y )/y

--Compreendendo listas,estrutura de uma lista:
--[corpo|geradores,filtros] onde:
--corpo:são os elementos componentes da lista
--geradores:fornece os candidatos a lista de saída
--filtros: qualificam os elementos q farão parte da lista de saída
--Exemplos:

--ler 100 numeros inteiros e imprimir quais são pares e quais são ímpares
pares=[n|n<-[1..100],n`mod`2==0]
impares=[i|i<-[1..100],i`mod`2==1]

--múltiplos de 4 entre 1 e 100
multiplos=[n|n<-[4..100],n`mod`4==0]

--Receber uma Frase(por ex. "hoje e sabado") e exibir
--essa frase invertida("sabado e hoje"):
frase::String->String
frase f=unwords(reverse(words f))

--explicação sobre algumas funções:
--words transforma String em uma Lista
--unwords transforma lista em String
--reverse inverte uma lista
--concat concatena 2 listas
--map transforma todos os elementos de uma lista Ex.:
--map (^2) [2,3] mostrará [4,9]

--Banco de Dados(na verdade tuplas) em Haskell-parece Struct de C-
--tipos Tuplas são sempre maíusculas--
--exemplo simples usando uma sextupla de videolocadora representando as
--aquisições de filmes
type Usuario = String
type Filme = String
type Diretor = String
type Genero = String
type Sexo = Char
type Dia = Int
type Mes = Int
type Ano = Int
type DataAluguel = (Dia,Mes,Ano)
type Aquisicao = (Usuario,Sexo,Filme,Diretor,Genero,DataAluguel)
type BancoDeDados = [Aquisicao]

banco::BancoDeDados
banco=[("Ana Paula",'f',"ET","Steven Spielberg","drama",(12,12,2004)),
("José Leonardo",'m',"Monella","Tinto Brass","comedia",(10,12,2004))]

usuarioDaFita::Aquisicao->Usuario
usuarioDaFita(nomeDoUsuario,sexo,filme,diretor,genero,dataAluguel)=nomeDoUsuario

diretorFita::Aquisicao->Diretor
diretorFita(nomeDoUsuario,sexo,filme,diretor,genero,dataAluguel)=diretor

nomeVideo::Aquisicao->Filme
nomeVideo(nomeDoUsuario,sexo,filme,diretor,genero,dataAluguel)=filme

generoVideo::Aquisicao->Genero
generoVideo(nomeDoUsuario,sexo,filme,diretor,genero,dataAluguel)=genero

--exemplo de relação que retorna o filme alugado pelo usuario:
aluguel::BancoDeDados->Usuario->[Filme]
aluguel banco usuario = [nomeVideo n|n<-banco,usuarioDaFita n==usuario]

--repare que os tipos tuplas podem ser compostos(como a Data)

--boa prova plawng!!!



>>>Originalmente postado em DEZ de 2004.

No comments: