5 ms·
It is an equality assertion: https://downloads.haskell.org/~ghc/7.6.1/docs/html/users_guide/equality-constraints.html https://downloads.haskell.org/~ghc/7.6.1/d
by eutectic 9y ago
It is an equality assertion: https://downloads.haskell.org/~ghc/7.6.1/docs/html/users_guide/equality-constraints.html https://downloads.haskell.org/~ghc/7.6.1/docs/html/users_gui...
- m-j-fox 9y agoThanks, but I still don't get it. So SpockState m equals BlockChainState? So getState's type is m BlockChainState? (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)?
- aviaviavi 9y agoYeah, it's for the compiler, otherwise it can't figure out that a BlockChainState is actually a SpockState m. I'm not really sure how it could otherwise, since the definition is completely decoupled from Spock. 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.
- m-j-fox 9y agoI'm farther from an expert than you. I tried (and failed) to find a less confusing way... 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.
- aviaviavi 9y agoAh, I think this is a better though! If you got this working, feel free to open up a PR. Or I can look into it when I get time.
- aviaviavi 9y agoAlso, unless I'm mistaken, TypeFamilies are the relevant GHC extension here. I'm not exactly sure how this would be written differently without that