Jump to content

Haskell features I’d like to see in other languages


Betovsky
 Share

Recommended Posts

Ora aqui vai mais uma posta de propaganda de Haskell  😁

http://intoverflow.wordpress.com/2010/06/30/haskell-features-id-like-to-see-in-other-languages/

Gostei bastante deste post. Para mim o mais importante é mesmo logo o 1º tópico. Separação da definição de classes e da sua implementação.

Outra para mim que não está na lista do gajo e que também gostava de ver noutras linguagens (e refiro-me mais ao C# que é o que uso no dia a dia) era ser permitido fazer overload a funções com base no parâmetro de retorno.

"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Link to comment
Share on other sites

Para mim o mais importante é mesmo logo o 1º tópico. Separação da definição de classes e da sua implementação.

Não sei se percebi bem. Se formos por exemplo para C++, existe uma separação entre a declaração e da definição das classes, embora os templates estraguem a festa. Por outro lado, penso que isto está a falar de algo do género de structural typing (que a linguagem Go suporta). Isto permite que não existe uma hierarquia de tipos, mas que qualquer tipo que obedeça à interface esperada seja usado. Ou é outra coisa completamente diferente?

Outra para mim que não está na lista do gajo e que também gostava de ver noutras linguagens (e refiro-me mais ao C# que é o que uso no dia a dia) era ser permitido fazer overload a funções com base no parâmetro de retorno.

Isso causa problemas com conversões implicitas (e provavelmente outros que não me estou agora a lembrar). Mas pode sempre existir algum suporte na linguagem para desambiguar essas situações. Sinceramente não é algo que me pareça assim tão útil, mas às vezes surgem situações em que seria útil.

<3 life

Link to comment
Share on other sites

Não sei se percebi bem. Se formos por exemplo para C++, existe uma separação entre a declaração e da definição das classes, embora os templates estraguem a festa. Por outro lado, penso que isto está a falar de algo do género de structural typing (que a linguagem Go suporta). Isto permite que não existe uma hierarquia de tipos, mas que qualquer tipo que obedeça à interface esperada seja usado. Ou é outra coisa completamente diferente?

Não, isso é mais parecido com Duck Typing. Classes em Haskell são as Interfaces nas outras linguagens. Vou fazer um pequeno exemplo (básico) usando C#, que é a qual com que estou mais a vontade. Isto é C# inválido já que não existe a separação da definição.

Imagina que queres pegar em objectos Pessoa e converter para CSV. Então crias uma interface para isso.

public interface CSVable {
   string ToCSV();
}

Agora podias definir para vários tipos.

Int32 : CSVable {
  public string ToCSV() {
      return this.ToString();
  }
}

String : CSVable {
  public string ToCSV() {
     var s = this;
     if(s.Any( c => c == ',' || c == '\n' || c == '"')) {
         s = s.Replace("\"","\"\"");
         s = "\"" + s + "\"";
     }
     return s;
  }
}

Agora temos algures o nosso objecto Pessoa.

public class Pessoa {
   public string Nome {get;set;}
   public int Idade { get; set;}
   
   // Construtor e métodos de lógica ...
}

E dizemos que é CSVable

Pessoa : CSVable {
  string ToCSV() {
     return String.Format("{0},{1}", this.Nome.ToCSV(), this.Idade.ToCSV());
  }
}

E para finalizar também poderiamos dizer..

IEnumerable<T> : CSVable
  where T : CSVable {

  string ToCSV() {
     return String.Join("\n", this.Select(x => x.ToCSV()).ToArray());
  }
}

Isso causa problemas com conversões implicitas (e provavelmente outros que não me estou agora a lembrar). Mas pode sempre existir algum suporte na linguagem para desambiguar essas situações. Sinceramente não é algo que me pareça assim tão útil, mas às vezes surgem situações em que seria útil.
Conversões implícitas? Haskell não tem disso...

Mais um exemplo simples, usando novamente C# que tem o exemplo perfeito que é uma coisa que não curto nada 👍

Quem me dera que em C# pode-se fazer isto.

public int Parse(this String s) { return int.Parse(s); }
public bool Parse(this String s) { return bool.Parse(s); }

//.. depois algures numa função qualquer...
   string s1 = "11";
   string s2 = "True";
   int idade = s1.Parse();
   bool vivo = s2.Parse();

Não há conversão implícita. Simplesmente o compilador escolhe a função a usar conforme o tipo de retorno necessário.

Já agora, usando também o exemplo anterior. Não seria simplesmente porreiro apenas ser necessário fazer

List<Pessoa> pessoas = ParseCSV("pessoas.csv");
List<Carro> carros = ParseCSV("carros.csv");

"Give a man a fish and he will eat for a day; Teach a man to fish and he will eat for a lifetime. The moral? READ THE MANUAL !"

Sign on a computer system consultant's desk

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
 Share

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.