El razonamiento sobre las firmas de tipo es una habilidad que solo proviene de la lectura / escritura de código funcional (ya que las funciones en FP tienden a tener firmas de tipo más complejas debido al polimorfismo incorporado).
Un buen consejo para comenzar es utilizar nuevas variables de tipo para las partes de la firma de las que no conoce el tipo. Por ejemplo, tanto f como x en dos veces fx = f (fx) tienen tipos polimórficos, ya que no hay nada en el cuerpo de la función que restrinja el tipo (como esto def: twicePlusOne fx = f (fx) + 1 , donde el el tipo de retorno está restringido a ser de tipo Int ). Entonces, usando variables de tipo fresco (generalmente comenzando con a, b, c… (o sus equivalentes griegos), podemos razonar sobre la firma de f como (a -> a) , ya que en el cuerpo de dos veces f simplemente toma un argumento para devolver un resultado Y el resultado debe ser del mismo tipo que el tipo de argumento de f ya que f se aplica directamente al resultado de (fx) . Dado que hemos establecido que el tipo de argumento de f debe ser a , podemos deducir que el tipo de x también debe ser a , ya que estamos aplicando f a x .
Se nos ocurrió lo siguiente:
f :: (a -> a)
x :: a
y como un resultado
- ¿Se considera [matemática] x = y ^ 2 [/ matemática] una parábola?
- ¿Qué es [math] \ sqrt [4] {a ^ 2} [/ math] con [math] a [/ math] siendo negativo?
- ¿A quién se le ocurrió el método de ‘completar el cuadrado’?
- ¿Alguien puede integrar [math] \ sin ^ {- 1} (x \ sqrt {1-x} – \ sqrt {x (1-x ^ 2)}) [/ math]?
- ¿Puedo dar cos (arctan (a / b)) como respuesta en un examen?
dos veces :: (a -> a) -> a ->?
Lo último que queda por descubrir es el tipo de retorno de la función dos veces . Esto es bastante simple de deducir ya que conocemos el tipo de retorno de f ; El valor de retorno de la función dos veces se calcula aplicando f , por lo que la función dos veces debe tener el mismo tipo de retorno que f. Esto produce la siguiente firma de tipo dos veces:
dos veces :: (a -> a) -> a -> a
Espero que haya sido fácil de seguir, ya que describe cómo podría razonar sobre las firmas de tipo polimórfico.