Исключение с плавающей запятой возникло при кодировании в JSON в GHCi, GHCi завершается

#haskell

#haskell

Вопрос:

Я попытался запустить код из http://gregorycollins.net/posts/2011/10/01/cufp2011/index.html # (43) в GHCi, но получил «Исключение с плавающей запятой», и GHCi завершает работу.

 {-# LANGUAGE OverloadedStrings #-}

import           Control.Applicative
import           Data.Aeson
import           Data.Attoparsec (parseOnly)
import           Data.ByteString.Char8  (ByteString)
import qualified Data.ByteString.Char8 as S
import qualified Data.ByteString.Lazy.Char8 as L


------------------------------------------------------------------------------
example1 :: ByteString -> Either String Coord
example1 bs = parseOnly json bs >>= convert
  where
    convert value = case fromJSON value of
                      (Error e)   -> Left e
                      (Success a) -> Right a

example2 :: Coord -> ByteString
example2 c = S.concat $ L.toChunks $ encode c


------------------------------------------------------------------------------
data Coord = Coord { _x :: Double, _y :: Double }
  deriving (Show, Eq)

instance ToJSON Coord where
    toJSON (Coord x y) = object ["x" .= x, "y" .= y]


instance FromJSON Coord where
    parseJSON (Object v) = Coord    <$>
                           v .: "x" <*>
                           v .: "y"

    -- A non-Object value is of the wrong type, so use mzero to fail.
    parseJSON _          = empty
  

 λ> :l JsonExample.hs 
[1 of 1] Compiling Main             ( JsonExample.hs, interpreted )
Ok, modules loaded: Main.
λ> example2 $ Coord 1 1
"Floating point exception
  

Комментарии:

1. Какая ОС? Я никогда не слышал, чтобы ghci просто умирал таким образом, но я бы предположил, что это связано с проблемами в blaze-textual здесь: github.com/mailrank/blaze-textual#readme

2. @ivanm, Linux myhost 3.0-ARCH #1 SMP PREEMPT Tue Aug 30 07:32:23 UTC 2011 i686 Intel(R) Core(TM)2 Duo CPU E8400 @ 3.00GHz GenuineIntel GNU/Linux

Ответ №1:

Возникающий FPE является ошибкой GHC, см. http://hackage.haskell.org/trac/ghc/ticket/5386 для получения более подробной информации.

Вы можете попробовать использовать http://hackage.haskell.org/package/aeson-native package вместо этого (он совместим с API aeson ), что позволяет избежать использования библиотеки C , которая вызывает эту проблему (с помощью blaze-textual-native ), или вы можете попробовать перекомпилировать blaze-textual (а затем также перекомпилировать aeson , чтобы он получил перекомпилированный blaze-textual ) в собственном режиме с помощью

 cabal install -fnative
  

(см https://github.com/mailrank/blaze-textual/blob/master/README.markdown для получения более подробной информации)