Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
选项库,如Google GFlags for Haskell_Haskell_Options_Getopt_Gflags - Fatal编程技术网

选项库,如Google GFlags for Haskell

选项库,如Google GFlags for Haskell,haskell,options,getopt,gflags,Haskell,Options,Getopt,Gflags,我有兴趣为Haskell提供类似于Google的flags库的东西 以下是gflags的小介绍,说明了我为什么喜欢它: 我在Hackage上查看了各种类似getopt的库,但我没有找到一个与gflags的简单性和灵活性相匹配的库 也就是说,我希望有以下特点: 生成--help(使用帮助中提到的默认值) 除了解析用户给出的选项外,它还应该在不匹配的选项上出错,这样用户就有机会注意到输入错误 标志可以在任何模块中轻松声明(希望是在顶层,如果需要,模板Haskell hackery是可以接受的) 基

我有兴趣为Haskell提供类似于Google的flags库的东西

以下是gflags的小介绍,说明了我为什么喜欢它:

我在Hackage上查看了各种类似getopt的库,但我没有找到一个与gflags的简单性和灵活性相匹配的库

也就是说,我希望有以下特点:

  • 生成--help(使用帮助中提到的默认值)
  • 除了解析用户给出的选项外,它还应该在不匹配的选项上出错,这样用户就有机会注意到输入错误
  • 标志可以在任何模块中轻松声明(希望是在顶层,如果需要,模板Haskell hackery是可以接受的)
  • 基本上不需要调用我声明标志的所有模块,而是标志在启动/链接/任何时间以某种方式注册
  • 如果main必须调用一个通用的初始化函数,比如gflags的google::ParseCommandLineFlags(&argc,&argv,true)中的函数,那么就可以了 google::ParseCommandLineFlags(&argc, &argv, true);
  • 可以纯粹地使用标志(是的,我认为这是unsafePerformIO的适当用法,以使API更简单)

在环顾四周但没有成功之后,我开始考虑自己做这件事(当然,在Hackage上分享)。但是,我完全不知道注册部分的实施情况。我需要类似于GCC的((构造函数))属性或C++的静态初始化的东西,但是在Haskell中。标准的顶级unsafePerformIO是不够的,因为它是懒惰的,所以在main开始运行之前不会调用它。

您可能会喜欢,尽管我没有充分使用它来判断它是否满足您的所有约束条件。

在调查了所有关于Hackage的解决方案之后(感谢所有提示!),我继承了Don的typeclass实现思想,创建了一个名为HFlags的库

这是关于黑客的:


我也有一篇博客文章描述了这一点:

有什么问题吗?如何确保已声明标志的所有实例都可见?你考虑过一个类型的课程吗?这不是一个特别好的方法。Haskell模块通常不会自动产生与全局状态有关的魔力,这主要是因为Haskell程序实际上没有全局状态。至少在导入模块时,您需要模块能够运行代码,而在纯函数式编程中,这是没有原因的,因为没有状态这样的东西。唐:很抱歉没有明确说明这个问题。我想知道是否有类似的东西我还没有找到。如果没有,那么我需要在模块之间实现我的标志注册机制。我考虑过使用类型类来进行此攻击,我主要关注以下内容(虚构的示例):main imports ProtocolServer,ProtocolServer imports TCPServer,TCPServer定义标志tcp_soreuseaddr::Bool。现在,梅因将看不到这面旗帜,第四次黑客也看不到。这就是为什么我想要一些静态初始化。马修:谢谢你的评论。我知道我所要求的不是通常的Haskell,但Google GFlags库在getopt成为标准时在它的思维中也不常见。尽管如此,如果您在下一个c/c++项目中尝试gflags,您将永远不会返回getopt。命令行解析是一件特殊的事情,其中一些不安全的performio使工作变得更容易,而不是更困难。毕竟,在一次程序运行期间,命令行值不会改变。唐:对不起,你是对的。我的问题可以用类型类来处理,只是:信息误导了我。我报告了一个关于我的困惑的问题()。如果我用类型类hack完成了我的实现,我将在这里分享它,谢谢你的想法!这与我的要求相反,但谢谢你的指点。