TAD - Haskell

Boa tarde, pessoal!

Estou tentando seguir um tutorial sobre Haskell para ver como funciona esse ambiente.
Se alguém puder me dar uma ajuda, tipo:

tenho o modulo de um TAD num arquivo e sua utilização é realizada em outro arquivo.

[code]
–TAD Pilha Exportacao Explicita,as operações listadas estaram visiveis
module Pilha(Pilha,vazia,pop,top,push,ehvazia)where
data Pilha a = Pvazia|P1 (a,Pilha,a)
deriving(Show)

top :: Pilha a -> a
top Pvazia = error "pilha vazia"
top (P1(a,p)) = a

pop :: Pilha a -> Pilha a
pop Pvaiza = error "pilha vazia"
pop (P1(a,p)) = p

push :: (a,Pilha,a) -> Pilha a
push (a,p) = P1(a,p)

ehvazia :: Pilha a -> Bool
ehvazia Pvazia = True
ehvazia _ = False

vazia :: () -> Pilha a
vazia() = Pvazia[/code]
Utilização do TAD:

[code]module UsaPilhas where

import Pilha

–lineariza pilha
lineariza :: Pilha a -> [a]
lineariza p
| ehvazia§ = []
| otherwise = top§:lineariza(pop§)[/code]

tutorial completo: http://www.mat.uc.pt/~pedro/lectivos/ProgramacaoFuncional/apontamentosHaskellcap6.pdf

O nome do arquivo deve ser o mesmo nome do modulo, isto tem alguma coisa haver ???

Este tipo de teste pode ser realizado no Interpretador Haskell GHCi ou tem que ser compilado no GHC???

Para executa-lo é somente entrar com o nome do módulo no interpretador ?

fazendo desta forma o seguinte erro está ocorrendo:

Prelude> UsaPilhas

<interactive>:1:0: Not in scope: data constructor `UsaPilhas'
Prelude> 

O que pode ser ???
:?:

Vlws!!!
:idea:

Bom, um amigo meu que programa em Haskell disse uma vez que tudo o que você procura sobre Haskell pode ser respondido nesse site:

http://learnyouahaskell.com/

Detalhe: eu não procurei saber se era verdade, só estou passando o site pra ver se pode lhe ajudar. Abraços!

Para carregar dentro do ghci use o comando:

(é o nome do arquivo sem extensão .hs)

[quote=mi.rodrigues]Bom, um amigo meu que programa em Haskell disse uma vez que tudo o que você procura sobre Haskell pode ser respondido nesse site:

http://learnyouahaskell.com/

Detalhe: eu não procurei saber se era verdade, só estou passando o site pra ver se pode lhe ajudar. Abraços![/quote]

Valew!

Estou com esse livro aqui… rsrs

[quote=gomesrod]Para carregar dentro do ghci use o comando:

(é o nome do arquivo sem extensão .hs)[/quote]

blz!

Velho, quando eu estou no modo interpretado eu tenho que carregar todos aquivos que vou utilizar ?

No caso eu tenho o arquivo principal.hs e o modulo.hs

GHCi, version 6.12.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude> :load modulo
[1 of 1] Compiling Pilha            ( modulo.hs, interpreted )

modulo.hs:11:4: Not in scope: data constructor `Pvaiza'
Failed, modules loaded: none.
Prelude> 

O seguinte erro está ocorrendo, o q poderia ser ?
:idea:

[quote=Miltex]

GHCi, version 6.12.1: http://www.haskell.org/ghc/  :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linking ... done.
Prelude&gt; :load modulo
[1 of 1] Compiling Pilha            ( modulo.hs, interpreted )

modulo.hs:11:4: Not in scope: data constructor `Pvaiza'
Failed, modules loaded: none.
Prelude&gt; 

O seguinte erro está ocorrendo, o q poderia ser ?
:idea: [/quote]

Neste caso parece um erro de digitacao.
Seria Pvazia no lugar de Pvaiza

Pvaiza != Pvazia :smiley:

Na verdade parece que esse exemplo tem mais alguns erros… estou tentando fazer funcionar aqui e precisou mexer umas coisas.
Não vou contar para não estragar a surpresa e ver se você consegue.

O principal.hs é o que “UsaPilha” ?
Se for, pode carregar só ele, o “import Pilha” que está lá dentro vai carregar o Pilha

[quote=gomesrod]Pvaiza != Pvazia :smiley:

Na verdade parece que esse exemplo tem mais alguns erros… estou tentando fazer funcionar aqui e precisou mexer umas coisas.
Não vou contar para não estragar a surpresa e ver se você consegue.

O principal.hs é o que “UsaPilha” ?
Se for, pode carregar só ele, o “import Pilha” que está lá dentro vai carregar o Pilha[/quote]

blz?

aqui, o nome do modulo tem que ser o mesmo nome do arquivo ?

O arquivo principal.hs é o que utilizará o TAD pilha.

[code]Prelude> :load modulo
[1 of 1] Compiling Pilha ( modulo.hs, interpreted )

modulo.hs:3:28:
Pilha' is not applied to enough type arguments Expected kind’, but Pilha' has kind -> *'
In the type (a, Pilha, a)' In the definition of data constructorP1’
In the data type declaration for `Pilha’
Failed, modules loaded: none.
Prelude> [/code]
Alterei alguns erros sintáticos e a seguinte mensagem surgiu…

Como eu disse antes eu sou iniciante em Haskell, qual a complexidade dos erros…
Meu proposito aqui é apenas ver como funciona essa questão de modulos e tals…

O nome do arquivo tem que ser igual sim… o comando import busca um arquivo com esse nome, e o módulo declarado lá dentro tem que estar de acordo.

Mas mesmo assim o código tem alguns erros, não sei se foi apenas problema de digitação ou se o cara pensou de uma maneira que não consegui compreender :?
O código que funcionou para mim foi esse aqui:

[code]module Pilha(Pilha,vazia,pop,top,push,ehvazia)where
data Pilha a = Pvazia | P1 a (Pilha a)
deriving(Show)

top :: Pilha a -> a
top Pvazia = error "pilha vazia"
top (P1 a p) = a

pop :: Pilha a -> Pilha a
pop Pvazia = error "pilha vazia"
pop (P1 a p) = p

push :: a -> Pilha a -> Pilha a
push a p = P1 a p

ehvazia :: Pilha a -> Bool
ehvazia Pvazia = True
ehvazia _ = False

vazia :: Pilha a
vazia = Pvazia [/code]

Agora… esse exemplo tem coisas demais para alguém principiante. É melhor seguir a apostila Learn You a Haskell , ela vem beeeeem passo-a-passo (o que é importante pois estamos entrando em um novo paradigma de programação!)

Saudosismo agora, a linguagem que mais gostei de aprender foi Haskell e meu mestrado foi nessa linguagem que pra mim é a mais facil de se criar um compilador.

Infelizmente pra mercado é difícil trabalhar com ela e acabei ficando no Java mesmo. Mas é bom saber que tem gente usando.

Verdade, é muito interessante mesmo! Abre um novo horizonte na maneira de pensar, além de ter uma sintaxe bonitinha :slight_smile:

Estudei para ter uma noção de programação funcional, e justamente por essa questão de saber que nunca vou poder usar na prática acabei parando antes de chegar nos conceitos mais avançados. Infelizmente precisei do tempo para estudar outras coisas mais necessárias no momento :frowning:

[quote=marcosalex]Saudosismo agora, a linguagem que mais gostei de aprender foi Haskell e meu mestrado foi nessa linguagem que pra mim é a mais facil de se criar um compilador.

Infelizmente pra mercado é difícil trabalhar com ela e acabei ficando no Java mesmo. Mas é bom saber que tem gente usando.[/quote]

blz, Marcos… é o que sempre ouço, eu também estou utilizando com proposito acadêmico…rsrsrsr mas não pretendo seguir o mestrado com este paradigma de programação…rsrsrsr
só preciso me formar msm…kkkkkkkk

valew!!!

Até onde li sobre Haskell … sua arquitetura é bem parecida com JAVA (pacotes) no que diz a respeito da arquitetura… de acordo com (http://learnyouahaskell.com/) ela é modularizada (namespace) e
possui as características de OO tais como; Polimorfismo e tals…

não é isso msm ??? ou entendi errado ???
:?:

valews!!!

O problema que vejo para adoção em massa de Haskell é que traz muitos aspectos diferentes do que é comum hoje em dia.
É lazy, funcional e pura.

O impacto da mudança é maior do que de java para ruby, por exemplo.
Apesar de uma ser estática e outra dinâmica, não há grandes revoluções de paradigma.

Scala talvez seja uma alternativa mais viável nesse ponto, o número de diferenças é menor.

De qualquer forma, tem umas pessoas aqui e outras ali usando Haskell.
Se encontrarem uma nicho que ela traga uma vantagem estratégica sobre outras, talvez se popularize mais.

Um brother meu aqui me deu um help… o codigo ficou assim:
:smiley:

[code]
module Principal where

import Modulo

–lineariza pilha
lineariza :: Pilha a -> [a]
lineariza p
| ehvazia§ = []
| otherwise = top§:lineariza(pop§)[/code]

[code]
–TAD Pilha Exportacao Explicita,as operações listadas estaram visiveis
module Modulo(Pilha,vazia,pop,top,push,ehvazia)where
data Pilha a = Pvazia|P1 (a,Pilha a)
deriving(Show)

top :: Pilha a -> a
top Pvazia = error "pilha vazia"
top (P1(a,p)) = a

pop :: Pilha a -> Pilha a
pop Pvazia = error "pilha vazia"
pop (P1(a,p)) = p

push :: (a,Pilha a) -> Pilha a
push (a,p) = P1(a,p)

ehvazia :: Pilha a -> Bool
ehvazia Pvazia = True
ehvazia _ = False

vazia :: () -> Pilha a
vazia() = Pvazia[/code]
Valew!!!
:idea: