は、私は、次のコードを持っている:オンとオフを最適化してコンパイルするときハスケル(2部)ではどのように例外処理が行われますか?
{-# LANGUAGE DeriveDataTypeable #-}
import Prelude hiding (catch)
import Control.Exception (throwIO, Exception)
import Control.Monad (when)
import Data.Maybe
import Data.Word (Word16)
import Data.Typeable (Typeable)
import System.Environment (getArgs)
data ArgumentParserException = WrongArgumentCount | InvalidPortNumber
deriving (Show, Typeable)
instance Exception ArgumentParserException
data Arguments = Arguments Word16 FilePath String
main = do
args <- return []
when (length args /= 3) (throwIO WrongArgumentCount)
let [portStr, cert, pw] = args
let portInt = readMaybe portStr :: Maybe Integer
when (portInt == Nothing) (throwIO InvalidPortNumber)
let portNum = fromJust portInt
when (portNum < 0 || portNum > 65535) (throwIO InvalidPortNumber)
return $ Arguments (fromInteger portNum) cert pw
-- Newer 'base' has Text.Read.readMaybe but alas, that doesn't come with
-- the latest Haskell platform, so let's not rely on it
readMaybe :: Read a => String -> Maybe a
readMaybe s = case reads s of
[(x, "")] -> Just x
_ -> Nothing
その動作が異なります。
crabgrass:~/tmp/signserv/src% ghc -fforce-recomp Main.hs && ./Main
Main: WrongArgumentCount
crabgrass:~/tmp/signserv/src% ghc -O -fforce-recomp Main.hs && ./Main
Main: Main.hs:20:9-34: Irrefutable pattern failed for pattern [portStr, cert, pw]
これはなぜですか?私はそれを知っていますimprecise exceptions can be chosen from arbitrarily;ここでは厳密な例外と不正確な例外の1つを選択しているため、警告は適用されません。
これは私のバグのようです。どのGHCバージョンを使用していますか?私はGHC 7.6.2と同じ動作をします。 – hammar
@hammar少なくとも7.6.1と7.4.1で発生し、#haskellでそれを持ち上げた人は7.0.xを使用していました。 –
@DanielWagnerそれは奇妙です。なぜなら、7.0.2と7.0.4では 'WrongArgumentCount'が得られるからです。 (また6.12.3) –