尝试使用ReadArgs package,似乎它不支持单参数情况。

{-# LANGUAGE ScopedTypeVariables #-}

import ReadArgs (readArgs)

main = do
  (foo :: Int) <- readArgs
  print foo

错误是(使用1.0版时):
No instance for (ReadArgs.ArgumentTuple Int)
  arising from a use of `readArgs'

我的问题是双重的:
  • readArgs如何工作?
  • 如何调整该库以使其也可以使用单个参数?

  • N.B. ReadArgs的1.1版消除了此“错误”;看评论。

    最佳答案

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

    另外,我不确定该实例是否存在任何问题,尽管它适用于您介绍的示例。我认为库中缺少它是有原因的,但是我可能是错的。

    更新

    在尝试了几件事之后,确保它们仍然可以工作(如以下示例),我相当确信这不会造成任何问题,因此也许它(或类似的东西)的存在只是一个疏忽。
    main = do
        (foo :: Int, bar :: Int) <- readArgs
        print foo
        print bar
    

    10-08 19:57