No Thinking With Types
Exercício 11.2-i é escrever a função com a seguinte assinatura de tipo.
weaken :: OpenSum f ts -> OpenSum f (x ': ts)
data OpenSum (f :: k -> Type) (ts :: [k]) where
UnsafeOpenSum :: Int -> f t -> OpenSum f ts
Acredito que o parágrafo anterior ao exercício forneça contexto suficiente para saber o que essa função realiza, mas não está claro para mim.
Na prática, também é útil poder ampliar as possibilidades de um montante em aberto. Uma nova função, enfraquecer, alinha o tipo machado na frente da lista de possibilidades.
Se eu tivesse alguns exemplos de uso dessa função, seria uma grande ajuda para eu concluir este exercício.
Na
UnsafeOpenSum :: Int -> f t -> OpenSum f ts
listats
não há nenhuma relação com as outras variáveis de tipo, portanto este construtor pode produzir valores do tipoOpenSum f ts
para qualquerts
.Portanto, obtemos
Observe que os dois termos
UnsafeOpenSum i ft
parecem iguais (exceto pelai
parte), mas são de tipos distintos.Além disso, precisamos de um novo índice
newI
, que você possa calcular em termos dei
.Como ter acesso ao construtor permite escolher qualquer lista
ts
do tipo, o construtor é nomeadoUnsafe....
para lembrar aos usuários que deve-se usá-lo apenas para implementar primitivas seguras (comoweaken
). Depois disso, espera-se que os usuários usem as primitivas seguras sem acessar o construtor de nível inferior.