如何推翻受歧视的工会

2024-06-21

我正在尝试对受歧视的联盟实施折叠。 DU称为Expr,表示程序表达式,并且通常是递归的。我正在尝试编写一个折叠,以递归方式累积 Exprs 上的操作结果。下面是我尝试写的折叠。

let rec foldProceduralExpr (folder : 's -> Expr list -> 's) (state : 's) (expr : Expr) : 's =
    let children =
        match expr with
        | Series s -> s.SerExprs
        | Lambda l -> [l.LamBody; l.LamPre; l.LamPost]
        | Attempt a -> a.AttemptBody :: List.map (fun ab -> ab.ABBody) a.AttemptBranches
        | Let l -> l.LetBody :: List.concat (List.map (fun lb -> match lb with LetVariable (_, expr) -> [expr] | LetFunction (_, _, body, _, pre, post, _) -> [body; pre; post]) l.LetBindings)
        | Case c -> c.CaseTarget :: List.concat (List.map (fun branch -> [branch.TBBody; branch.TBTest]) c.CaseBranches)
        | Condition c -> List.concat (List.map (fun branch -> [branch.TBBody; branch.TBTest]) c.CondBranches)
        | List l -> l.ListElements
        | Array a -> Array.toList a.ArrElements
        | Composite c -> LunTrie.toValueList (LunTrie.map (fun _ mem -> mem.MemExpr) c.CompMembers)
        | _ -> []
    let listFolder = fun state expr -> foldProceduralExpr folder state expr
    let listFolded = List.fold listFolder state children
    folder state (expr :: listFolded)

问题是代码不起作用,这是已知的,因为我收到错误the construct causes code to be less generic than indicated by the type annotations. The type variable 's has been constrained to be type 'Expr list' on listFolded在最后一行。这是因为定义foldProceduralExpr几乎肯定是错误的。

现在,我很想修复代码并因此修复类型错误,但我根本不知道如何修复。我想我缺乏的是对非列表或递归数据结构的折叠如何工作的理解。我最近将 trie 的折叠从 OCaml 翻译为 F#,并且在理解该折叠如何工作方面遇到了很多困难。

问题 1:这段代码是否有一个我可以理解的可见修复?

问题 2:是否有资源可以获取了解如何编写这些类型的折叠所需的背景知识?

如果您需要更多信息,请告诉我。我没有将 DU 包括在内,因为它太大、太复杂,无法使问题清晰。希望足以说明,这是典型的 Lisp 风格 AST 数据结构。

后续问题:一旦它起作用,我还想用该折叠写一张地图。这看起来像一张典型的地图吗?还是需要额外的脑力才能弄清楚?

编辑:关于托马斯的帮助,我把最后三行变成了 -

let exprs = expr :: children
let listFolder = fun state expr -> foldProceduralExpr folder state expr
let listFolded = List.fold listFolder state exprs
folder listFolded exprs

我希望这仍然有意义。

编辑:这是我的最终解决方案。这是普遍的关于生孩子的事情 -

let rec foldRdu (getChildren : 't -> 't list) (folder : 's -> 't -> 't list -> 's) (state : 's) (parent : 't) : 's =
    let children = getChildren parent
    let listFolder = fun state child -> foldRdu getChildren folder state child
    let listFolded = List.fold listFolder state children
    folder listFolded parent children

我将 Expr 和 Expr 列表作为折叠值的原因是我想保留父/子关系的结构以供以后使用。在某种程度上,我认为这是一个非常特定于领域的折叠。


第一个问题是,你想要实现什么样的折叠?树状结构有多种选择。假设你有一个n-ary树(即任意数量的子节点),您可以:

  1. 仅应用折叠功能Expr叶子中的节点
  2. 在叶子上应用折叠函数,然后将其应用于所有内部节点(递归调用后)
  3. 在处理树时对内部节点应用折叠函数,然后对叶子应用折叠函数

在您的示例中,您的文件夹函数需要Expr list这让我有点困惑 - 我认为你可以给它当前的Expr不是子列表,但将其称为子列表也是一种选择。

您首先进行递归调用,然后在当前表达式上调用文件夹,所以我想您想实现选项 2。我可以理解折叠的前两行:

// This defines a function that recursively folds the a given 
// expression and produces a new state of type 's
let listFolder = fun state expr -> foldProceduralExpr folder state expr 
// Here, you fold all children recursively starting with 'state' and 
// obtaining a result 'listFolded' of type 's
let listFolded = List.fold listFolder state children 

然而,最后一行可能是错误的:

// From the previous line, 'listFolded' is of type 's, but 
// here you use it as if it was a list:
folder state (expr :: listFolded) 

我假设你可能想使用listFolded随着国家传递给folder。该文件夹包含一个表达式列表,因此您可以给它children作为第二个参数(或者你可以改变folder只取一个Expr然后给它expr,恕我直言,这更有意义)。不管怎样,这应该让它工作,这样你就可以运行它并看看发生了什么:

folder listFolded children
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何推翻受歧视的工会 的相关文章

随机推荐

  • Android接收通知打开和取消事件

    我从 webService 接收数据以生成自定义通知 我想追踪Intent要知道open 点击 或cancel 滑动 通知上的事件 以报告服务器进行分析 有没有听众onIntentStart or onIntentCanceled 也许是通
  • 将 NULL 变量插入数据库

    我将变量设置为 NULL 我试图将其插入数据库 但由于某种原因 它们一直以 0 的形式提交 我确信我试图插入的列允许 NULL 并且默认值设置为 NULL 这是我的代码 insert NULL query mysql query INSER
  • 来源和出口有什么区别?

    我正在编写一个 shell 脚本 以读取具有 key value 对的文件并将这些变量设置为环境变量 但我有疑问 如果我这样做source file txt是否会将该文件中定义的变量设置为环境变量 或者我应该逐行读取文件并使用导出命令设置它
  • Spark MLlib - 训练隐式警告

    我在使用时不断看到这些警告trainImplicit WARN TaskSetManager Stage 246 contains a task of very large size 208 KB The maximum recommend
  • 如何检查目录是否有读/写权限

    我有一个如图所示的目录 d wx x x 2 bcheudev bcheudev 4096 Jun 18 06 16 test 这表明该目录没有读取权限 但是当我通过 shell 脚本检查相同内容时 它给出的结果是 dir test 具有读
  • 如何将变量添加到监视窗口

    Visual Studio 2008 专业版 好的 从 自定义 部分 我将 观察 快速观察 等工具栏命令添加到 调试 菜单中 但我想仔细观察一个变量 我们如何将其添加到手表中 我突出显示它并尝试添加它 但它已被禁用 我希望能够首先向手表添加
  • Make:在静态模式规则中设置特定于目标的变量

    我正在使用静态模式规则编写 Makefile 并且我希望为 TARGETS 的每个元素分配一个变量给当前目标名称 此处为 TARGETS a b c d all TARGETS TARGETS DIR TARGETS setup build
  • 是否可以恢复我删除的 xcdatamodel 文件?

    我愚蠢地删除了它 我删除了其中包含不同版本的文件 我可以恢复到旧快照 但从那时起我就已经完成了工作 是否可以恢复到我的存档之一 或者我只能从那里提交 共享 我仍然可以运行该应用程序 但我需要对数据库进行更改 Xcode 将 xcdatamo
  • 在 Jenkins 项目中加载私有存储库子模块

    我目前正试图让詹金斯 克隆项目及其子模块 使用部署密钥配置为 Github 私有存储库验证 Jenkins CI https stackoverflow com questions 5212304 authenticate jenkins
  • ggplot 直方图相对于轴的位置不正确

    我试图这样绘制直方图 Todo lo haremos con base en un variable aleatoria Uniforme 0 1 set seed 26 n 10000 U lt runif n n Supongamos
  • 如何修改.NET Core中的文件访问控制

    我正在尝试更改 NET Core 中文件的权限 然而 似乎FileInfo https msdn microsoft com en us library system io fileinfo setaccesscontrol v vs 11
  • 如何使用 LinkedIn javascript sdk 检索包括所有字段的职位列表?

    我想要获取 LinkedIn 会员在其个人资料中输入的每个职位的 ID 头衔 摘要 开始日期 结束日期 当前状态和公司名称 我测试了一个查询休息控制台 https apigee com console linkedin我得到了想要的结果 查
  • 如何在打字时自动调整垂直离子输入字段的大小

    当我输入长文本时 ion input字段保持相同的高度 我只能看到可用可见区域中的文本 当我输入时 我希望输入字段根据其中的数据自动垂直调整为 2 行或 3 行 My page html code
  • 如何从 Visual Studio 2012 导出 C# 应用程序以在其他计算机上运行?

    我刚刚在 Visual Studio 2012 中制作了我的第一个 C 应用程序 我想以某种方式导出它 以便其他人可以在他们的计算机 包括没有 Visual Studio 2012 的计算机 中使用它 我该怎么做 我是 C 新手 找不到任何
  • 避免使用一本字典的更好代码 - 区分大小写问题

    我有以下方法用数据读取器的值填充字典 数据读取器字段和传递给方法的属性之间可能存在大小写不匹配的情况 在下面的方法中 我首先将属性转换为小写以解决此问题 这会导致两个字典 有没有更好的方法用一本字典来实现这一目标 private Dicti
  • 是否可以使用检测重新定义核心 JDK 类?

    我想重新定义字节码StackOverflowError构造函数 因此当堆栈溢出发生时我有一个 钩子 我想要做的就是在构造函数的开头插入对我选择的静态方法的单个方法调用 是否有可能做到这一点 您应该能够使用两种方法之一来完成此操作 除非在过去
  • CSS 中的 * 有什么作用?

    明星是做什么的 这叫什么 对我来说 这是某种通配符 它叫什么名字 以便我可以阅读它 div zoom 1 this zoom 1 display inline display inline and this whats the differ
  • 读取google地图返回的JSON数据

    在我的应用程序中 我使用 BlackBerry API 来获取纬度和经度 我想通过创建 http 连接使用 Google 地图进行反向地理编码 如何解析数据 然后读取特定元素 例如地址 示例网址 给出回应 name 9 600000 76
  • 如何将逗号分隔的列值与另一个表作为行连接

    我试图通过首先转换我正在成功执行的 SupplierId 列中的逗号分隔值来连接两个表 然而 当我尝试通过外键 DCLink 加入另一个带有供应商名称的表 Vendors 时 问题就出现了 这就是我的意思 原始表的 select 语句 SE
  • 如何推翻受歧视的工会

    我正在尝试对受歧视的联盟实施折叠 DU称为Expr 表示程序表达式 并且通常是递归的 我正在尝试编写一个折叠 以递归方式累积 Exprs 上的操作结果 下面是我尝试写的折叠 let rec foldProceduralExpr folder