Estou trabalhando em Escreva para você mesmo um esquema em 48 horas (até cerca de 85 horas) e cheguei à parte sobre como adicionar variáveis e atribuições . Há um grande salto conceitual neste capítulo, e eu gostaria que tivesse sido feito em duas etapas, com uma boa refatoração no meio, em vez de pular direto para a solução final. De qualquer forma…
Eu me perdi com um número de diferentes classes que parecem servir o mesmo propósito: State
, ST
, IORef
, eMVar
. Os três primeiros são mencionados no texto, enquanto o último parece ser a resposta favorita para muitas perguntas do StackOverflow sobre os três primeiros. Todos eles parecem carregar um estado entre invocações consecutivas.
O que são cada um deles e como eles diferem um do outro?
Em particular, essas frases não fazem sentido:
Em vez disso, usamos um recurso chamado threads de estado , permitindo que Haskell gerencie o estado agregado para nós. Isso nos permite tratar variáveis mutáveis como faríamos em qualquer outra linguagem de programação, usando funções para obter ou definir variáveis.
e
O módulo IORef permite usar variáveis com estado dentro da mônada IO .
Tudo isso torna a linha type ENV = IORef [(String, IORef LispVal)]
confusa - por que a segunda IORef
? O que vai quebrar se eu escrever em type ENV = State [(String, LispVal)]
vez disso?