使ReadArgs 1.0使用单个参数

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)

我的问题是双重的:

  1. readArgs工作怎么样?
  2. 如何调整该库以允许它使用单个参数?

NB版1.1的ReadArgs消除了这个"错误"; 看评论.

ham*_*mar 9

据我所知,该软件包使用元组来模拟类型安全的异构列表.正如您所注意到的,当您只需要一个参数时,这会导致问题,因为Haskell中没有单元组.

但是,该包还为异构列表提供了适当的类型,可以使用它来代替元组::&类型.你使用它类似于:运算符,空元组()作为终结符:

(foo :: Int) :& (bar :: String) :& () <- readArgs
Run Code Online (Sandbox Code Playgroud)

这有一个论点:

(foo :: Int) :& () <- readArgs
Run Code Online (Sandbox Code Playgroud)

  • +1 ...这比必须定义新实例更好 (3认同)

Ada*_*ner 2

我不太明白我需要启用的所有扩展,但是您可以定义一个实例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)