Pergunta

Eu gostaria de entender qual é a diferença entre estes dois conceitos de programação. O primeiro representa a ausência de tipo de dados e no último o tipo existe, mas não há nenhuma informação. Além disso, reconheço que a Unidade vem de programação funcional fundamento teórico, mas eu ainda não consigo entender o que é a usabilidade da unidade primitiva (por exemplo, em um programa F #).

Foi útil?

Solução

O tipo de unidade apenas faz tudo mais regular. Até certo ponto, você pode pensar em cada função em F # como tomar um único parâmetro e retornar um único resultado. Funções que não necessitam de quaisquer parâmetros realmente ter "unidade" como um parâmetro e funções que não retornam qualquer resultado retornar "unidade" como resultado. Isto tem uma variedade de vantagens; por exemplo, considerar como em C # você precisará de uma enorme quantidade de delegados "Func" para representar funções de vários arities que valores de retorno, bem como uma enorme quantidade de delegados "Ação" que não retornam valores (porque, por exemplo Func<int,void> não é legal - vazio não pode ser usado dessa forma, já que não é um tipo de 'real' bastante).

Veja também # tipos de função F: divertir com tuplas e currying

Outras dicas

Na programação funcional, que geralmente falam de entradas de mapeamento para saídas. Isto significa, literalmente, mapeando um argumento para seu valor de retorno (s). Mas se algo vai ser uma função no sentido categoria teoria / matemática, tem que retornar algo . Um valor void representa que um nada função retorna, que é sem sentido nestes termos.

unit é a resposta funcional para void. É essencialmente um tipo com apenas um valor, (). Ele tem uma série de usos, mas aqui está um simples. Vamos dizer que você tinha algo como isso em uma linguagem imperativa mais tradicional:

public static <T, U> List<U> map(List<T> in, Function<T, U> func) {
  List<U> out = new ArrayList<U>(in.size());
  for (T t : in) {
     out.add(func.apply(t));
  }
  return out;
}

Isto aplica-se um determinado func função para cada elemento na lista, produzindo uma nova lista de tipo de saída de func. Mas o que acontece se você passar em uma função que simplesmente imprime seus argumentos? Não vai ter um tipo de saída, de modo que você pode colocar para U?

Em alguns idiomas, passando essa função um iria quebrar este código (como em C #, onde você pode void não atribuir a um tipo genérico). Você teria que recorrer a soluções alternativas como ter um Action<T>, que pode ficar desajeitado.

Este é o lugar onde o conceito de unit é útil: que é um tipo, mas que só pode ter em um único valor. Isso simplifica muito as coisas como encadeamento e composição, e vastamente reduz o número de casos especiais que você tem que se preocupar.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top