Esta pregunta no es subjetiva. Se utiliza un verbo muy específico en el libro de referencia, y me gustaría entender cuál es la implicación de esa redacción, porque me temo que estoy malinterpretando algo.
De Learn You a Haskell , el siguiente párrafo es el tercero y último que contiene "asumimos *".
data Barry t k p = Barry { yabba :: p, dabba :: t k }Y ahora queremos que sea una instancia de
Functor.Functorquiere tipos de tipos,* -> *peroBarryno parece que tenga ese tipo. ¿Cuál es el tipo deBarry? Bueno, vemos que toma tres parámetros de tipo, por lo que serásomething -> something -> something -> *. Es seguro decir quepes un tipo concreto y, por lo tanto, tiene una especie de*. Parak, suponemos*y así, por extensión,ttiene una especie de* -> *. Ahora vamos a reemplazar esos tipos con lossomethings que usamos como marcadores de posición y vemos que tiene una especie de(* -> *) -> * -> * -> *.
¿Por qué estamos asumiendo algo? Al leer "asumimos X (es decir, suponemos que X es verdadero)" es natural para mí pensar que también deberíamos considerar el caso de que X es falso. En el caso específico del ejemplo, ¿no podría tser amable (* -> *) -> *y kamable (* -> *)? Si este fuera el caso, lo que sea ty krealmente fuera, t kseguiría siendo un tipo concreto, ¿no?
Veo que toda la línea de razonamiento se compara con el compilador, pero no creo que el compilador asuma . Si es así, me gustaría saber qué, si no es así, nuevamente me temo que me estoy perdiendo el significado del párrafo.
k :: Lpara cualquier tipoL, siempre y cuandot :: L -> *. Sin embargo, un compilador aquí debe elegir algunos específicosL, o recurrir a un polykind. Un polykind sería la opción más general, pero aquí elige GHCL = *(Haskell básico no tiene polykinds, deben activarse como una extensión). Como elige algo que es bastante arbitrario, LYAH usa la palabra "asumir" (AFAICT).