Pregunta

Me gustaría entender que es la diferencia entre estos dos conceptos de programación. La primera representa la ausencia de tipo de datos y en el último existe el tipo pero no hay información. Además, reconozco que la unidad viene de la programación funcional fundamento teórico, pero todavía no puedo entender lo que es la facilidad de uso de la unidad primitiva (por ejemplo, en un programa de C #).

¿Fue útil?

Solución

El tipo de unidad sólo hace que todo sea más regular. Hasta cierto punto se puede pensar en cada función en C # como tomar un solo parámetro y devolver un único resultado. Las funciones que no necesitan ningún parámetro en realidad toman "unidad" como parámetro, y las funciones que no devuelven ningún "unidad" resultados de retorno como resultado. Esto tiene una variedad de ventajas; por su parte, cuenta cómo en C #, necesitará una gran cantidad de delegados "Func" para representar funciones de varios arities que devuelven valores, así como una gran cantidad de delegados "acción" que no devuelven valores (porque por ejemplo Func<int,void> no es legal - vacío no puede ser utilizado de esa manera, ya que no es un tipo bastante 'real').

F # tipos de funciones: diversión con tuplas de pellejo

Otros consejos

En la programación funcional, por lo general hablamos de entradas a salidas. Esto significa, literalmente, la cartografía de un argumento a su valor (s) de retorno. Pero si algo va a ser una función en el sentido matemático / categoría-teoría, se tiene que volver algo . Un valor void representa una función que no devuelve nada, que no tiene sentido en estos términos.

unit es la respuesta funcional a void. Básicamente se trata de un tipo con un único valor, (). Tiene una serie de usos, pero aquí es muy simple. Vamos a decir que tenía algo como esto en un lenguaje imperativo más 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;
}

Esto se aplica una función particular func a cada elemento de la lista, la producción de una nueva lista de tipo de salida de func. ¿Pero qué sucede si se pasa en una función que sólo imprime sus argumentos? No va a tener un tipo de salida, así que lo que se puede poner para U?

En algunos idiomas, pasando de una función de este tipo se rompería el código (como en C #, donde no se puede asignar void a un tipo genérico). Habría que recurrir a soluciones como tener un Action<T>, que puede conseguir torpe.

Aquí es donde el concepto de unit es útil: que es un tipo, pero que sólo se puede tomar en un solo valor. Esto simplifica mucho las cosas, como el encadenamiento y la composición, y enormemente reduce el número de casos especiales que tienen que preocuparse.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top