gpt4 book ai didi

haskell - Haskell 的 System.Console.GetOpt ReqArg 如何将 2 元函数作为其构造函数的第一个参数?

转载 作者:行者123 更新时间:2023-12-02 12:11:38 25 4
gpt4 key购买 nike

我对 Haskell 还很陌生,所以如果这是完全显而易见的并且我只是没有正确理解,请原谅我。

关于黑客攻击the documentation表示 System.Console.GetOpt ReqArg 采用 arity 1 的函数,例如 (String -> a) 作为其构造函数的第一个参数。

ReqArg (String -> a) String

在我看到的许多示例中,2 个参数函数被传递给此构造函数。

来自 ( https://wiki.haskell.org/High-level_option_handling_with_GetOpt ) 的示例:

data Options = Options  { optVerbose    :: Bool
, optInput :: IO String
, optOutput :: String -> IO ()
}

startOptions :: Options
startOptions = Options { optVerbose = False
, optInput = getContents
, optOutput = putStr
}

options :: [ OptDescr (Options -> IO Options) ]
options =
[ Option "i" ["input"]
(ReqArg
(\arg opt -> return opt { optInput = readFile arg })
"FILE")
"Input file"

, Option "o" ["output"]
(ReqArg
(\arg opt -> return opt { optOutput = writeFile arg })
"FILE")
"Output file"

, Option "s" ["string"]
(ReqArg
(\arg opt -> return opt { optInput = return arg })
"FILE")
"Input string"

, Option "v" ["verbose"]
(NoArg
(\opt -> return opt { optVerbose = True }))
"Enable verbose messages"

, Option "V" ["version"]
(NoArg
(\_ -> do
hPutStrLn stderr "Version 0.01"
exitWith ExitSuccess))
"Print version"

, Option "h" ["help"]
(NoArg
(\_ -> do
prg <- getProgName
hPutStrLn stderr (usageInfo prg options)
exitWith ExitSuccess))
"Show help"
]

所以我的问题是,当函数在其参数中使用时,值构造函数并没有真正强制执行类型,还是我还缺少其他东西?

更新:

这对我来说更有意义。我相信有几个因素被我忽略了。首先,正如 @CommuSoft 提到的,由于柯里化(Currying),所有函数在 Haskell 中实际上都是单一的。其次,我没有仔细研究选项,它不是函数而是类型的变量:

[ OptDescr (Options -> IO Options) ]

选项的此类型签名声明了 ReqArg 类型变量的类型以及其他类型构造函数 NoArg 和 OptArg(后者在示例中未使用)。

传递给 NoArg ArgDescr 构造函数的单个 arity 匿名函数本质上就是:

(Options -> IO Options)

例如它将接收选项实例记录

传递给 ReqArg 构造函数的 2 个匿名函数将是:

(String -> Options -> IO Options)

它将接收一个字符串(某人在命令行输入的值)和选项实例记录。

感谢大家帮助我思考这个问题!

最佳答案

您在类型签名中看到的 -> 实际上也是一种类型。因此,类型变量 a 可以是函数 b -> c。在您的示例中,它是Options -> IO Options

关于haskell - Haskell 的 System.Console.GetOpt ReqArg 如何将 2 元函数作为其构造函数的第一个参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34164599/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com