It is an equality assertion: https://downloads.haskell.org/~ghc/7.6.1/docs/html/users_gui...
(BlockChainState chain _ _) <- getState
But it has to be anyway so, I guess I'm still confused. Is the squiggle for extra documentation or is it a hint to help the type inference? Why would type inference need help? Does it have to do with some of the extensions that are applied in the source (but appear to be otherwise unused)?It should be noted that it's entirely possible there's a less confusing way to write that type signature. I'm far from an expert in Haskell.
One thing I see people doing when they have real gnarly type signature is to concentrate the horror in one place and paint a veneer of simplicity elsewhere:
type Get stateType returnType
= forall monad.
(SpockState monad ~ stateType, MonadIO monad, HasSpock monad)
=> monad returnType
Then elsewhere: getBlockChain :: Get BlockChainState [Block]
getLatestBlock :: Get BlockChainState Block
This may only help superficially as type errors will still be hard-to-understand.