Dan*_*ton 5 haskell command-line-arguments
使用ReadArgs包,它似乎不支持单参数情况.
{-# LANGUAGE ScopedTypeVariables #-}
import ReadArgs (readArgs)
main = do
(foo :: Int) <- readArgs
print foo
Run Code Online (Sandbox Code Playgroud)
错误是(使用版本1.0时):
No instance for (ReadArgs.ArgumentTuple Int)
arising from a use of `readArgs'
Run Code Online (Sandbox Code Playgroud)
我的问题是双重的:
readArgs工作怎么样?NB版1.1的ReadArgs消除了这个"错误"; 看评论.
据我所知,该软件包使用元组来模拟类型安全的异构列表.正如您所注意到的,当您只需要一个参数时,这会导致问题,因为Haskell中没有单元组.
但是,该包还为异构列表提供了适当的类型,可以使用它来代替元组::&类型.你使用它类似于:运算符,空元组()作为终结符:
(foo :: Int) :& (bar :: String) :& () <- readArgs
Run Code Online (Sandbox Code Playgroud)
这有一个论点:
(foo :: Int) :& () <- readArgs
Run Code Online (Sandbox Code Playgroud)
我不太明白我需要启用的所有扩展,但是您可以定义一个实例ReadArgs.ArgumentTuple a(即使它实际上不是一个语义上正确的名称),如下所示:
{-# LANGUAGE FlexibleInstances, UndecidableInstances,
OverlappingInstances, ScopedTypeVariables #-}
import ReadArgs
instance (Argument a) => ArgumentTuple a where
parseArgsFrom ss = do
a :& () <- parseArgsFrom ss
return a
usageFor a = usageFor (a :& ())
main = do
(foo :: Int) <- readArgs
print foo
Run Code Online (Sandbox Code Playgroud)
另外,我不太确定这个实例是否有任何问题,尽管它适用于您提供的示例。我认为图书馆丢失它是有原因的,但我可能是错的。
在尝试了一些事情之后,为了确保它们仍然有效(如下面的示例),我相当确信这不会导致任何问题,所以也许它(或类似的东西)的存在只是一个疏忽。
main = do
(foo :: Int, bar :: Int) <- readArgs
print foo
print bar
Run Code Online (Sandbox Code Playgroud)