Esta respuesta se basa en la respuesta de goblin, sus comentarios y mi experiencia reciente.
Notación del producto
Una función $f \colon A \to B$ es una forma de asignar a cada elemento de $A$ (el dominio) un elemento de $B$ (el codominio). También podemos pensar en esta función como un subconjunto de tuplas $f \subseteq A \times B$ que tiene la propiedad de que cada elemento de $A$ aparece exactamente una vez como primera entrada (izquierda). Utilizando $\prod$ como cuantificador del producto (cartesiano), podemos escribirlo como
$$f \in \prod_{a \in A} \{a\} \times B,$$
o utilizando la notación de índice
$$f \in \prod_{a \in A} B_a.$$
Con esta notación, podemos formular codominios más precisos para cada $a$ por ejemplo, para el caso general en el que $C \colon A \to 2^B$ mapas cada uno $a$ a un subconjunto de $B$ $$f \in \prod_{a \in A} C(a)_a,$$ lo que es más preciso que afirmar $f \colon A \to B$ .
Familias indexadas
Familias indexadas son básicamente los mismos que la notación del producto anterior, simplemente utilizando una notación diferente. Utilizando una familia indexada, podemos escribir $$f = (B_a)_{a \in A},$$ que significa lo mismo que $$f \in \prod_{a \in A} B_a.$$ Obsérvese que ambas anotaciones contienen la misma información: $a \in A$ y $B_a$ .
Cuando se utiliza una familia indexada, la aplicación de la función suele escribirse como $f_a$ en lugar de $f(a)$ pero como ambos significan lo mismo, son formalmente intercambiables. Aunque esto pueda resultar inesperado para algunos lectores.
Notación de la función exponencial como caso especial
Partiendo de la notación del producto $$f \in \prod_{a \in A} B_a,$$ podemos eliminar el índice $a$ si el codominio no depende del valor concreto de $a$ : $$f \in \prod_{a \in A} B.$$ Si reescribimos el producto anterior en forma exponencial, llegamos a la notación de función exponencial (más o menos) común $$f \in B^A.$$
0 votos
¿Qué tal si escribes $f:2^X\to X$ con $X\supset A\mapsto f(A)\in A$ ?
1 votos
@MundronSchmidt Sí, formular restricciones adicionales es una forma de conseguir el mismo resultado. Creo que en este caso, declarar simplemente " $f(A) \in A$ para todos $A$ " sería más claro.
0 votos
También he utilizado esta notación, o mejor dicho $f \colon (A \in 2^X) \to A$ cuando no se trata del tipo, para mis propios apuntes. No dudaría en introducirlo si alguna vez escribiera un artículo en el que fuera útil (algo que probablemente nunca haré).
0 votos
De hecho, he visto la notación en la teoría de tipos dependientes, por ejemplo $\mathsf{id} : (A : \mathsf{Type}) \to A \to A$ .
0 votos
@md2perpe, eso es una notación terrible. El codominio de $\mathrm{id}$ parece ser $A \rightarrow A$ . Así que supongo que se puede componer con flechas cuyo dominio es $A \rightarrow A$ . Es decir, buscamos flechas del tipo $(A \rightarrow A) \rightarrow X$ . Pero hay son no hay tales flechas, porque no hemos dicho al lector qué tipo de cosa $A$ es.
0 votos
@goblin. El codominio de $\mathsf{id}$ es $A \to A$ pero el codominio de $\mathsf{id}(A)$ es $A$ . No confundas $\mathsf{id}$ con $\mathrm{id}$ . Tenemos $\mathsf{id}(A) \sim \mathrm{id}_A$ . Se puede modificar la notación para marcar que $A$ no está en el dominio "real" y no puede ser dado como un argumento explícito a una llamada de la función, sino que es derivado automáticamente por el compilador: $\mathsf{id} : (\overline{A : \mathsf{Type}}) \to A \to A$ o $\mathsf{id} : (A : \mathsf{Type}) \Rightarrow A \to A$ .
0 votos
@goblin. En la parte superior de la p. 5 (páginas sin numerar) de cse.chalmers.se/~ulfn/papers/afp08/tutorial.pdf puedes ver
identity : (A : Set) -> A -> A
.0 votos
@md2perpe, si lo denotamos $\mathrm{id}$ o $\mathsf{id}$ mi punto sigue siendo, que es que ninguna función tiene dominio $A \rightarrow A$ porque no le hemos dicho al lector lo que $A$ es. Por eso considero que es una mala notación.
0 votos
@goblin. Nos hacer decirle al lector lo que $A$ es cuando se aplica por primera vez $\mathsf{id}$ a algún tipo: $\mathsf{id}(\mathsf{Int}) : \mathsf{Int} \to \mathsf{Int}$ .
0 votos
@md2perpe, sí, claro. Si estamos dispuestos a centrarnos en la evaluación así podemos conseguir que funcione. Esto no es una sorpresa en realidad; básicamente estamos interpretando $f : (x:X) \rightarrow Y_x$ para significar $f : \prod_{x:X} Y_x$ . Pero supongamos que no queremos pensar en términos de evaluación. Supongamos que somos teóricos de la categoría y pensamos en términos de composición de funciones. Una "función" de la forma $f : (x:X) \rightarrow Y_x$ no tiene ninguna forma significativa de ser compuesta con una función de la forma $g : Y_x \rightarrow Z$ por lo que veo, porque no sabemos qué $x$ es. Así que....
0 votos
... si pensamos categóricamente, y para mí al menos, eso es básicamente lo que sugiere la flecha, creo que es mejor poner el $x:X$ en otro lugar. Por ejemplo, podríamos escribir $$f : 1 \xrightarrow{x:X} Y_x, \qquad g : Y_x \xrightarrow{x:X} Z,$$ que se puede componer para obtener $$g\circ f : 1 \xrightarrow{x:X} Z.$$ Esto me parece mucho más satisfactorio, porque no hemos tirado la composición de la función por la ventana.
0 votos
Otra notación posible sería: $$\frac{x\in X \vdash f : 1 \rightarrow Y_x \qquad x\in X \vdash g : Y_x \rightarrow Z}{x \in X \vdash g\circ f : 1 \rightarrow Z}.$$ Elijamos lo que elijamos, debemos asegurarnos de que la composición de la función siga funcionando correctamente, imvho.
0 votos
@goblin. Ni siquiera se nos permite escribir $f : (x:X) \to Y_x$ desde $Y$ no ha sido introducido antes de ser utilizado. Deberíamos escribir $f : (X : \mathsf{Type}) \to (x : X) \to (Y : X \to \mathsf{Type}) \to Y(x)$ .
0 votos
@md2perpe, lo siento, quise dar a entender que $X$ era un tipo fijo pero arbitrario, no una variable. Así, por ejemplo, dejemos que $X = \mathsf{Int}$ para concretar. Ha sido un descuido por mi parte.
0 votos
@goblin. Es $Y$ ¿también se supone que es una función de tipo fijo (con nombre/global)? Permítame entonces utilizar el estilo sans-serif: $\mathsf{X}$ . En ese caso podemos escribir $f : (x : \mathsf{X}) \to \mathsf{Y}(x)$ y si $g : (x : \mathsf{X}) \to \mathsf{Y}(x) \to \mathsf{Z}$ entonces no podemos componerlas directamente, sino que tenemos que "lambda" en $x$ : $$h : (x : \mathsf{X}) \to (f(x)(g(x)(y)) : \mathsf{Z})$$
0 votos
@md2perpe, sí, a eso me refiero. No podemos componerlos directamente. Para mí, esto sugiere que no debemos usar el $\rightarrow$ notación en la forma que describes. Como seguro que sabes, en la teoría de categorías, distinguimos entre un morfismo $X \xrightarrow{f} Y$ y su representación $1 \xrightarrow{f} [X,Y]$ como elemento de un objeto. Como los dominios/codominios son diferentes, es mejor pensar en ellos como entidades diferentes. No me importa actualizar la notación $[X,Y]$ para permitirnos escribir $[x:X,Y_x]$ en lugar de $\prod_{x:X}Y_x$ pero creo que deberíamos dejar la notación de flecha en paz.
0 votos
@goblin. Aun así, no es por la notación con tipos dependientes sino por los tipos que no coinciden directamente. No podemos componer $f : \mathsf{X} \to \mathsf{Y} \to \mathsf{Z}$ y $g : \mathsf{Z} \to \mathsf{W}$ directamente tampoco; tenemos que hacer $(\lambda x) (\lambda y) g(f(x)(y)) : \mathsf{W}$ .
0 votos
@goblin. Y he observado que mi fórmula para $h$ arriba está mal. Por supuesto que debería ser $$h : (x : \mathsf{X}) \to (g(x)(f(x)) : \mathsf{Z})$$
0 votos
@goblin. No sabía que la teoría de categorías distinguía entre un morfismo y su representación. No he estudiado teoría de categorías, sólo he leído algo en internet.
0 votos
También puedo mencionar otra anotación: $\mathsf{id} : \forall(A : \mathsf{Type}) (A \to A)$ lo que significa que para cualquier tipo $A$ , $\mathsf{id}$ mapas de $A$ a $A$ es decir $\forall(A : \mathsf{Type}) (\mathsf{id} : A \to A)$ .