Esta questão não é subjetiva. Um verbo muito específico é usado no livro referenciado, e eu gostaria de entender qual é a implicação dessa frase, porque temo estar entendendo mal alguma coisa.
De Learn You a Haskell , o parágrafo a seguir é o terceiro e o último que contém "assumimos *".
data Barry t k p = Barry { yabba :: p, dabba :: t k }E agora queremos fazer disso uma instância do
Functor.Functorquer tipos do tipo,* -> *masBarrynão parece ter esse tipo. Qual é o tipo deBarry? Bem, vemos que são necessários três parâmetros de tipo, então serásomething -> something -> something -> *. É seguro dizer quepé um tipo concreto e, portanto, tem um tipo de*. Poisk, assumimos*e, por extensão,ttem uma espécie de* -> *. Agora, vamos substituir esses tipos pelossomethings que usamos como espaços reservados e vemos que tem um tipo de(* -> *) -> * -> * -> *.
Por que estamos assumindo alguma coisa? Ao ler "assumimos X (ou seja, assumimos que X é verdadeiro)", é natural para mim pensar que também devemos considerar o caso de que X é falso. No caso específico do exemplo, não poderia tser do tipo (* -> *) -> *e kdo tipo (* -> *)? Se fosse esse o caso, qualquer que fosse te krealmente fosse, t kainda seria um tipo concreto, não?
Vejo que toda a linha de raciocínio é então verificada no compilador, mas não acho que o compilador assuma . Se isso acontecer, gostaria de saber o que, se não acontecer, novamente. Receio estar perdendo o significado do parágrafo.
k :: Lpara qualquer tipoL, desde quet :: L -> *. Um compilador aqui deve, no entanto, escolher alguns específicosLou recorrer a uma polignidade. Uma poli-classe seria a opção mais geral, mas aqui o GHC escolheL = *(Haskell básico não tem poli-classes, elas precisam ser ativadas como uma extensão). Como escolhe algo arbitrário, a LYAH usa a palavra "assumir" (AFAICT).