From "Eelis van der Weegen" <haskell-libs@contacts.eelis.net>.
Testcase:
> import System.Console.GetOpt
>
> type Color = String
>
> optsDesc :: [OptDescr Color]
> optsDesc = [Option "" ["color", "colour"]
> (ReqArg id "color") "Foreground color"]
>
> main = do
> let args = ["--col=blue"]
> case getOpt RequireOrder optsDesc args of
> (_, _, err:_) -> putStrLn err
> _ -> return ()
Output:
option `--col' is ambiguous; could be one of:
--color=color, --colour=color Foreground color
--color=color, --colour=color Foreground color
This error is silly, because the two alternatives listed are the same
option. The problem is caused by incorrect use of a generator in a list
comprehension.
import Prelude -- necessary to get dependencies right
-import Data.List ( isPrefixOf )
+import Data.List ( isPrefixOf, find )
-- |What to do with options following non-options
data ArgOrder a
longOpt :: String -> [String] -> [OptDescr a] -> (OptKind a,[String])
longOpt ls rs optDescr = long ads arg rs
where (opt,arg) = break (=='=') ls
- getWith p = [ o | o@(Option _ xs _ _) <- optDescr, x <- xs, opt `p` x ]
+ getWith p = [ o | o@(Option _ xs _ _) <- optDescr
+ , find (p opt) xs /= Nothing ]
exact = getWith (==)
options = if null exact then getWith isPrefixOf else exact
ads = [ ad | Option _ _ ad _ <- options ]