Aşağıdaki kod var:Haskell'de istisnalar nasıl çalışıyor (ikinci bölüm)?
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]
neden şudur:
{-# 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
Onun davranış ve kapalı optimizasyonlar ile derlenmiş farklılık? Ben imprecise exceptions can be chosen from arbitrarily; ama burada bir tek ve kesin olmayan istisnadan birini seçiyoruz, böylece uyarı geçerli olmamalıdır.
Bu bana bir hata gibi görünüyor. Hangi GHC sürümünü kullanıyorsunuz? Aynı davranışı GHC 7.6.2 ile görüyorum. – hammar
@hammar Burada en az 7.6.1 ve 7.4.1'de oluyor ve onu #haskell'e getiren kişi 7.0.x kullanıyordu. –
@DanielWagner Bu garip, çünkü 7.0.2 ve 7.0.4'te, WrongArgumentCount'u alıyorum. (Ayrıca 6.12.3) –