#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 для получения более подробной информации)