Ocaml 多态记录类型不太通用

2024-01-07

给定以下类型:

 type ('props,'state) reactInstance =
  {
  props: 'props;
  state: 'state;
  updater:
    'event .
      (('props,'state) reactInstance -> 'event -> 'state) ->
        ('props,'state) reactInstance -> 'event -> unit;}

我正在努力实现:

let rec updater f instance event =
  let nextState = f instance event in
  let newInstance =
    { props; state = nextState; updater } in
  ()

let newInstance =
  { props; state = (reactClass.getInitialState ()); updater }

我给了更新程序一个类似 forall 的类型定义。我的主要动机是因为更新程序将被事件调用。事先不知道该事件会是什么。它可以是用户界面上的点击或按键等。

内部发生的问题updater定义于{ props; state = nextState; **updater** } :

Error: This field value has type
         (React.reactInstance props#1618 state#1200 => 'a => state#1200) =>
React.reactInstance props#1618 state#1200 => 'a => unit
       which is less general than
         'event.
  (React.reactInstance 'props 'state => 'event => 'state) =>
  React.reactInstance 'props 'state => 'event => unit

为什么会在内部发生这种情况let rec updater... on updater而不是在定义记录时updater in let newInstance? 我该如何解决这个问题?


你正在做所谓的“多态递归”。这是一个递归函数,可以在每个递归循环中对不同类型调用。就您而言,它的类型没有太大不同,但将函数放入带有 forall 的容器中。

众所周知,多态递归是无法确定的推断,因此您需要通过使用来帮助类型检查器多态注释 https://ocaml.org/manual/polymorphism.html。在这种情况下,还需要eta扩展实例函数(参见ivg的其他答案)。这是最终结果。请注意,您的函数缺少参数。

type ('props,'state) reactInstance = {
  props: 'props;
  state: 'state;
  updater:
    'event .
      (('props,'state) reactInstance -> 'event -> 'state) ->
    ('props,'state) reactInstance -> 'event -> unit;}

let rec updater
  : 'event .
    'props ->
    (('props,'state) reactInstance -> 'event -> 'state) ->
    ('props,'state) reactInstance -> 'event -> unit
  = fun props f instance event ->
    let nextUpdater f i e = updater props f i e in
    let nextState = f instance event in
    let newInstance =
      { props; state = nextState; updater = nextUpdater } in
    ()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ocaml 多态记录类型不太通用 的相关文章

  • OCaml 中的线性类型

    Rust http www rust lang org 有一个线性类型系统 有什么 好的 方法可以在 OCaml 中模拟这个吗 例如 当使用 ocaml lua 时 我想确保仅当 Lua 处于特定状态 堆栈顶部的表等 时才调用某些函数 Ed
  • 链接“let”语句时使用“and”还是“in”更好?

    我意识到这可能是一个愚蠢的问题 但是 如果我把一堆let不需要需要了解彼此价值观的语句 使用是否更好and or in 例如 以下哪一个更可取 如果有 let a foo and b bar and c baz in etc or let
  • OCaml 文字负数?

    我在学 这是我觉得奇怪的事情 let test treeways x match x with when x lt 0 gt 1 when x gt 0 gt 1 gt 0 如果我这样称呼它 test threeways 10 我会得到类型
  • C++ 多态加载/保存

    我正在保存并重新加载一堆从公共基础派生的不同对象到一个文件 显然我需要存储类名 或类似的名称 以便在重新加载时创建正确的对象类型 保存很简单 class Base virtual string className const 0 void
  • 泛型与接口的实际优势

    在这种情况下 使用泛型与接口的实际优势是什么 void MyMethod IFoo f void MyMethod
  • 如何使用继承来建模 RESTful API?

    我有一个需要通过 RESTful API 公开的对象层次结构 但我不确定我的 URL 应该如何构建以及它们应该返回什么 我找不到任何最佳实践 假设我有从动物继承的狗和猫 我需要对狗和猫进行CRUD操作 我还希望能够对一般动物进行手术 我的第
  • 在基类集合上调用派生方法

    我有一个名为 A 的抽象类 以及实现 A 的其他类 B C D E 我的派生类持有不同类型的值 我还有一个 A 对象的列表 abstract class A class B class A public int val get privat
  • 从父类调用子类方法

    a doStuff 方法是否可以在不编辑 A 类的情况下打印 B did stuff 如果是这样 我该怎么做 class Program static void Main string args A a new A B b new B a
  • 调用基本方法而不是覆盖方法

    在 C 中 类A包含一个公共方法Foo 它进行一些处理并返回一个值 protected method Bar 也在课堂上A执行与以下相同的逻辑Foo 然后进行一些额外的处理 然后返回一个值 为了避免重复代码 Bar calls Foo 并使
  • 使用fold_left/right反转OCaml中的列表

    更新 解决方案 感谢 jacobm 的帮助 我想出了一个解决方案 Folding Recursion let reverse list 3 theList List fold left fun element recursive call
  • RankN多态性和令人发指的克莱斯利之箭

    我不明白为什么 demobind1 的定义会产生一些编译器错误 它看起来像一个愚蠢的翻转 但不知何故 LANGUAGE GADTs LANGUAGE RankNTypes ScopedTypeVariables TypeOperators
  • 深拷贝和动态转换 unique_ptr

    假设我有一个如下所示的类 class A virtual A class B public A class C public A 我还有一个 unique ptr 向量 它是这样声明的 std vector
  • 创建指向类对象的指针数组

    问题 创建一个至少包含四个指向 Reader 对象的指针的数组 使用 New 运算符创建至少四个指向派生类对象的指针并将它们分配给数组 我不确定我做对了还是错了 Reader 是基类 John David Daniel Mark 是派生类
  • Kotlin 中扩展函数的多态性

    我有几个我无法控制的课程 我已经在几个常见的 属性 上创建了几个同名的扩展方法 名称相同的扩展函数始终返回相同的值类型 尽管针对每种类型的接收器以不同的方式计算 这里有一个简化的基于仅一个属性的内置类型的示例 DOES NOT COMPIL
  • 变体的结构比较

    我想处理整数行的限制 我想拥有Pervasives compare treat RightInfinity gt Point x对全部x 以及反函数LeftInfinity In the ocaml REPL type open pt Le
  • Swift 中的协议与多态性

    我对面向对象编程相当陌生 我正在尝试了解协议 委托和多态性 我最近观看了一个培训视频 其中宣传当您有两个相似且具有相似方法实现的类时 协议是优雅地实现此目的的最佳解决方案 这就说得通了 然而 一些额外的研究让我发现了多态性 听起来这也是一种
  • 实体框架中的多态性

    具体类 BankAccount and CreditCard 在控制器上不可见 我被这个问题困扰了 我正在使用该网站的示例 http weblogs asp net manavi archive 2010 12 28 inheritance
  • 如何正确重载流运算符以在多态类中进行打印?

    编辑 代码有一个拼写错误 现在它可以编译 但我仍然没有得到我想要的输出 我正在尝试重载流运算符std cout std fstream等等 但我无法正确处理多态性 我无法获得我想要看到的输出 我希望子类先显示超类的内容 然后显示其内容 而超
  • Swig C++ w/ Java 在多态回调函数上丢失类型[重复]

    这个问题在这里已经有答案了 可能的重复 SWIG Java 保留从 C 反弹的对象的类信息 https stackoverflow com questions 9817516 swig java retaining class inform
  • 通过命令行参数选择要使用的 ocaml 模块

    在我的代码中我有module M Implementation1然后我参考M 代替Implementation1 问题是 我必须重新编译我的程序才能改变Implementation1 to Implementation2 我想通过命令行参数

随机推荐

  • matplotlib 中的误差线显示在其他曲线上

    我有一个图 其中一些数据由带有误差线的散点图表示 我想为其拟合一条曲线 但是 无论我在代码中的哪个位置绘制曲线 误差线都会浮在其上方 我希望拟合的曲线显示在误差线前面 否则我看不到它 这是该问题的一个简单示例 import numpy as
  • Google Maps Api 从标记获取标题

    当我将标记推入数组时 它会正确绘制标记 并向数组添加标题 我知道这有效 因为当我 console log 时console log markersArray 它返回以下内容 标记的标题是next door 下面是我的标记单击 打开了信息窗口
  • FB 个人资料图片总是返回为“.jpg”?

    尝试通过 Facebook 社交图谱提取用户图像 奇怪的是 无论我上传图像是什么 gif bmp tiff 或 jpg 我都会调用https graph facebook com 507988137 picture type large h
  • 从 systemd 运行持久性 python 脚本?

    我有一个 python 脚本 可以解码 USB 设备的输入并将命令发送到 php 脚本 从控制台运行时 该脚本运行良好 但我需要它在启动时运行 我创建了一个 systemd 服务来启动脚本 它看起来运行良好 除了systemctl star
  • 使用 Java8 将数组迭代转换为 lambda 函数

    我正在尝试转换为 Lambda 函数 到目前为止 我可以将上面的代码转换为 lambda 函数 如下所示 Stream of acceptedDetails rejectedDetails filter list gt isNull lis
  • 未知提供者:uniqueFilterProvider 在 Angular.js 中使用唯一过滤器

    我是 AngularJS 的新手 我正在尝试实现过滤来为选择框构建唯一的选项列表 我的代码如下
  • 对数据框进行子集化,以便包含每行的最大值和列名称

    我想要对数据帧 df 进行子集化 以便仅包含第 1 至 10 列每行的最大值以及列的名称 示例数据框 0 1 2 3 4 0 01 0 12 0 41 0 11 0 11 0 13 0 12 0 33 0 14 0 07 0 02 0 20
  • C++ 专用模板继承自非专用版本

    我试图解决一个问题 但找到了不同的解决方案 然而出于好奇想知道以下是否可能 template lt class gt struct S template lt gt struct S lt Foo gt struct lt Foo gt 我
  • 将字符串转换/编译为 Objective-C 中的可执行代码

    我想在 ObjC 中获取一个字符串并对其进行评估 就好像它是代码一样 例如 这些是虚构的函数 NSString Cmd if 10 gt 5 NSLog Test MyClass Run Cmd 我希望 Test 出现在输出日志中 我搜索并
  • 无法让 Jasper 报告与 jsp/servlet 一起使用

    几周来我一直在努力让 Jasper 报告正常工作 它在 Eclipse 中运行良好 Jasper 网站上的演示也可以运行 它在 JBoss 中的 jsp 页面上不起作用 我的 jsp 页面非常基本 它调用类中的方法 它肯定会达到这一点 因为
  • 数据库驱动程序中已编译的预备语句是否仍需要在数据库中进行编译?

    在 Oracle JDBC 驱动程序中 有一个选项可以缓存准备好的语句 我对此的理解是 准备好的语句由驱动程序预编译 然后缓存 这提高了缓存的准备好的语句的性能 我的问题是 这是否意味着数据库永远不必编译那些准备好的语句 JDBC 驱动程序
  • 如何在 Ubuntu Linux 中搜索并替换文件中的内容?

    我的平台 Ubuntu linux工作站 在一个目录中 我有一系列文件 文件名为xxx 1 in到xxx 50 in 对于每个文件 我想将 abc 替换为 def 如果我单独执行 我应该输入 g abc s def g 如何编写一个脚本来一
  • 证明多元线性回归模型效率的最佳 RMSE(均方根误差)值范围是多少? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我是机器学习领域的新人 遵循一些简单的 ML 技术 我构建了一个基于多元线性回归的 ML 模型 用于预测系统的计算资源使用情况 因此 当我
  • 带有嵌入层的 Keras LSTM 自动编码器

    我正在尝试在 Keras 中构建一个文本 LSTM 自动编码器 我想使用嵌入层 但我不确定如何实现 代码如下所示 inputs Input shape timesteps input dim embedding layer Embeddin
  • 项目构建失败时 Android Studio 挂起/冻结

    从今晚开始我遇到了一个非常棘手的问题 如果我的 Android 项目中有任何错误 并且构建失败 那么我的 Android 工作室就会冻结 卡住 除了杀死 Android studio 应用程序之外我什么也做不了 即使我下次打开同一个项目 g
  • 找到包含所有负循环的最小子图

    我陷入了以下问题 给定一个加权有向图 G 我想构造 G 的最小子图 其中包含 G 的所有负 简单 循环 我确实知道如何使用贝尔曼福特找到负循环 并且我知道有向图中简单循环的数量是指数级的 解决这个问题的一种天真的方法是简单地迭代所有简单循环
  • 如何使用 PyQt4 将文件移动到不同平台上的回收站/垃圾箱?

    我想向我的跨平台 PyQt4 应用程序添加下一个功能 当用户选择某个文件并选择 删除 操作时 该文件将被移动到回收站文件夹 而不是永久删除 我想我可以使用 Win32 API 或类似的东西找到特定于 Windows 的解决方案 但我想知道是
  • ImportError:没有来自 django-grappelli 的名为 apps 的模块

    我正在我的旧机器上开发一个 django 项目 它运行良好 现在我正在尝试将我的 django 开发环境转移到新机器 Linux 作为我的项目中的依赖项 我在其中使用 django grappelli 我已经使用以下命令安装了 django
  • 跨 ipdb 会话的历史记录

    这个问题已经被asked https stackoverflow com q 17138106 1224076以前 但我找不到好的答案 所以 我想再次询问一下 我希望我的 ipdb 能够记住跨会话的命令 现在 它可以提取在 Ipython
  • Ocaml 多态记录类型不太通用

    给定以下类型 type props state reactInstance props props state state updater event props state reactInstance gt event gt state