gpt4 book ai didi

haskell - GetOpt的用法和foldl、flip、id

转载 作者:行者123 更新时间:2023-12-02 12:01:33 26 4
gpt4 key购买 nike

在 System.Console.GetOpt 文档中给出的第二个示例(在此处复制)中,我无法理解或解压此行:

(o,n,[]  ) -> return (foldl (flip id) defaultOptions o, n)

这个foldl在做什么,它是如何实现的? (flip id) 的目的是什么?这是怎么回事?

代码:

import System.Console.GetOpt
import Data.Maybe ( fromMaybe )

data Options = Options
{ optVerbose :: Bool
, optShowVersion :: Bool
, optOutput :: Maybe FilePath
, optInput :: Maybe FilePath
, optLibDirs :: [FilePath]
} deriving Show

defaultOptions = Options
{ optVerbose = False
, optShowVersion = False
, optOutput = Nothing
, optInput = Nothing
, optLibDirs = []
}

options :: [OptDescr (Options -> Options)]
options =
[ Option ['v'] ["verbose"]
(NoArg (\ opts -> opts { optVerbose = True }))
"chatty output on stderr"
, Option ['V','?'] ["version"]
(NoArg (\ opts -> opts { optShowVersion = True }))
"show version number"
, Option ['o'] ["output"]
(OptArg ((\ f opts -> opts { optOutput = Just f }) . fromMaybe "output")
"FILE")
"output FILE"
, Option ['c'] []
(OptArg ((\ f opts -> opts { optInput = Just f }) . fromMaybe "input")
"FILE")
"input FILE"
, Option ['L'] ["libdir"]
(ReqArg (\ d opts -> opts { optLibDirs = optLibDirs opts ++ [d] }) "DIR")
"library directory"
]

compilerOpts :: [String] -> IO (Options, [String])
compilerOpts argv =
case getOpt Permute options argv of
(o,n,[] ) -> return (foldl (flip id) defaultOptions o, n)
(_,_,errs) -> ioError (userError (concat errs ++ usageInfo header options))
where header = "Usage: ic [OPTION...] files..."

最佳答案

flip id 的类型为 b -> (b -> c) -> c,您可以在此处找到说明:Why does Haskell's "flip id" has this type?

foldl (flip id) defaultOptions o 子表达式执行以下操作:

  1. defaultOptions 作为初始值(defaultOptions 的类型为 Options)
  2. o 中获取每个元素(每个元素的类型为 Options -> Options)
  3. 使用 flip id 函数折叠所有元素(它具有 b -> (b -> c) -> c 类型)

由于所有 o 元素都会更改给定配置中的相应选项,因此 foldl (flip id) defaultOptions o 的结果将是所有已解析选项的配置。所有错过的选项均替换为 defaultOptions 中的默认值。

(o,n,[] ) -> return (foldl (flip id) defaultOptions o, n) 表达式的其他部分非常简单:

  1. (o,n,[] ) -> 匹配已解析选项列表、非选项列表和空错误列表
  2. return (..., n) 只是将值 (..., n) 放入 monad IO (Options, [String])

关于haskell - GetOpt的用法和foldl、flip、id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32343586/

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