acfoltzer / nbt

A parser/serializer for Minecraft's Named Binary Tag (NBT) data format.
BSD 3-Clause "New" or "Revised" License
22 stars 8 forks source link

nbt-0.7 is not compiling (use of 'fail' in Data/NBT.hs) #12

Open DolphinTechCodes opened 4 years ago

DolphinTechCodes commented 4 years ago

I am trying to compile nbt-0.7 with ghc 8.8.3 (stac lts-16.1) and get the following error:

Preprocessing library for nbt-0.7..
nbt   > Building library for nbt-0.7..
nbt   > [1 of 1] Compiling Data.NBT
nbt   >          
nbt   > /tmp/stack-d638f12c11d32bcc/nbt-0.7/src/Data/NBT.hs:113:53: error:
nbt   >     • No instance for (MonadFail Data.Serialize.Put.PutM)
nbt   >         arising from a use of ‘fail’
nbt   >     • In the expression: fail "Attempted to write heterogeneous list"
nbt   >       In a case alternative:
nbt   >           x : xs
nbt   >             | all (\ e -> typeOf e == ty) xs -> return ty
nbt   >             | otherwise -> fail "Attempted to write heterogeneous list"
nbt   >             where
nbt   >                 ty = typeOf x
nbt   >       In a stmt of a 'do' block:
nbt   >         ty <- case elems ts of
nbt   >                 [] -> return EndType
nbt   >                 x : xs
nbt   >                   | all (\ e -> typeOf e == ty) xs -> return ty
nbt   >                   | otherwise -> fail "Attempted to write heterogeneous list"
nbt   >                   where
nbt   >                       ty = typeOf x
nbt   >     |    
nbt   > 113 |                  | otherwise                     -> fail "Attempted to write heterogeneous list"
nbt   >     |                                                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
nbt   >          

I tracked the problem down and fount that the new version of GHC has dropped the fail function for Monads. See the proposal. A suiting fix would be replacing fail with error as that was the default behaviour of the PutM monad instance.

acfoltzer commented 4 years ago

Thank you! I will try to take a look this weekend.

stepcut commented 3 years ago

There are two uses of fail in that file. The one in the Get monad should be ok, since there is a MonadFail Get instance. But the Put one needs to be changed to error.

I can submit a pull request, but it is just a one-liner, plus version bump.

stepcut commented 3 years ago

If you add me as a maintainer here and on hackage, I can upload a new version. I maintain this library,

https://github.com/stepcut/minecraft-data

And it currently does not build on anything higher than GHC 8.6 due to nbt not building.

davidgarland commented 3 years ago

Any chance of this being resolved? I don't have any particular rush (I had just wanted to play with NBT and noticed a package already existed, and so looked here and noticed it had an error) but this seems like a fairly small issue to just allow to be a showstopper.