使用不带标签的 Core.Std.List.fold_left

2024-04-27

我正在尝试 Core 的List.fold_left.

# List.fold_left;;
- : 'a Core.Std.List.t -> init:'b -> f:('b -> 'a -> 'b) -> 'b = <fun>

当我指定标签时它工作正常:

# List.fold_left [1;2;3] ~init:0 ~f:(+);;
- : int = 6                  

但当我不指定标签时,我会得到不同的结果:

# List.fold_left [1;2;3] 0 (+);;
- : init:(int -> (int -> int -> int) -> '_a) ->
    f:((int -> (int -> int -> int) -> '_a) ->
       int -> int -> (int -> int -> int) -> '_a) ->
    '_a
= <fun>

其他部分应用程序也会产生非直观类型。为什么我可以在列表参数后添加任意数量的 0?

# List.fold_left [1;2;3] 0;;
- : init:(int -> '_a) -> f:((int -> '_a) -> int -> int -> '_a) -> '_a = <fun>

# List.fold_left [1;2;3] 0 0;;
- : init:(int -> int -> '_a) ->
    f:((int -> int -> '_a) -> int -> int -> int -> '_a) -> '_a
= <fun>

其他一些函数也表现出相同的行为:

# let app ~f ~x = f x;;
val app : f:('a -> 'b) -> x:'a -> 'b = <fun>

# app (fun x -> x + 1) 1;;
- : f:('a -> (int -> int) -> int -> 'b) -> x:'a -> 'b = <fun>

但是一些带标签的函数在没有给出标签的情况下应用时能够返回预期结果。例如:

# List.map;;
- : 'a Core.Std.List.t -> f:('a -> 'b) -> 'b Core.Std.List.t = <fun>

# List.map [1;2;3] (fun x -> x + 1);;
- : int Core.Std.List.t = [2; 3; 4]

为什么有些函数在没有给出标签的情况下应用时会返回不直观的值,而其他函数则按预期工作?


根据手册 http://caml.inria.fr/pub/docs/manual-ocaml-4.00/manual006.html#toc35您只能省略标签“如果应用程序是完整的(省略所有可选参数)”,并附上重要的警告“该功能类似于ListLabels.fold_left其结果类型是类型变量将永远不会被视为完全应用。”

所以自从核心的fold_left当然,它的结果类型也是一个类型变量,没有标签就不能调用它。当你这样做时会发生什么,位置参数被解释为由fold_left它仍然等待您提供带标签的参数。

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

使用不带标签的 Core.Std.List.fold_left 的相关文章

  • R 中函数多态性的建议做法是什么?

    假设我想写一个函数R这是对某些数据进行充分统计的函数 例如 假设函数 调用它foo func仅取决于数据样本的样本均值 为了方便起见 我认为用户可能喜欢传递到foo func随机变量的样本 在这种情况下foo func计算样本平均值 or样
  • 我可以重写 C# 中的属性吗?如何?

    我有这个基类 abstract class Base public int x get throw new NotImplementedException 以及以下后代 class Derived Base public int x get
  • 使用 Akka java API 时 Kotlin 类型推断编译错误

    我想在 Kotlin 程序中使用 Akka java API 当我想设置时onCompleteakka 的回调Future 我遇到了 Kotlin 编译器错误 而 java 等效项工作得很好 val future Future
  • 使用 Rank2Types 相比 RankNTypes 有什么优势吗?

    据我所知 仅 针对 2 级类型存在可判定的类型检查算法 GHC 是否以某种方式利用了这一事实 它有任何实际意义吗 是否还有 2 级类型的主要类型概念和类型推断算法 如果是的话 GHC 使用它吗 与Rank 2类型相比 Rank 2类型还有其
  • 如何使用shoulda匹配器来测试多态关联?

    我正在使用带有rails的shoulda matchers 并创建一个名为 comments 的模型和另一个名为 post 的模型 评论是多态的 当我在这样的帖子中使用 shoulda 匹配器进行测试时 it should have man
  • 使用只有一个元组值的变体类型构造函数

    type foo Foo of int int let t 1 2 Foo t Error The constructor Foo expects 2 argument s but is applied here to 1 argument
  • 使用不带标签的 Core.Std.List.fold_left

    我正在尝试 Core 的List fold left List fold left a Core Std List t gt init b gt f b gt a gt b gt b
  • OCaml:如何运行包含库的脚本

    我正在按照 Real World OCaml 一书来学习 OCaml 许多程序都需要使用 Jane Street Core 库 当我在顶层使用这个核心库中的函数时 它工作得很好 在那里 我只需使用以下命令来打开 Core 库 use top
  • 识别输入的数据类型

    我正在尝试打印用户输入的数据类型并生成如下表 ABCDEFGH String 1 09 float 0 int true bool etc 我正在使用 Python 3 2 3 并且我知道我可以使用type 获取数据的类型 但在Python
  • 在 C# 中将字符串转换为类型[重复]

    这个问题在这里已经有答案了 如果我收到一个包含类名称的字符串 并且我想将该字符串转换为真实类型 字符串中的类型 我该怎么做 I tried Type GetType System Int32 例如 它似乎有效 但是当我尝试使用自己的对象时
  • 如何制作Applicative的固定长度向量实例?

    最近了解了推广 决定尝试写向量 LANGUAGE DataKinds GADTs KindSignatures module Vector where data Nat Next Nat Zero data Vector Nat gt gt
  • 为什么我们在Java中使用接口引用类型? [复制]

    这个问题在这里已经有答案了 我即将参加第一门面向对象编程课程的期末考试 但我仍然不明白多态性的概念 假设我有一个抽象类 Vehicle 该类有一个名为 Aircraft 的子类 我的问题是 这两个代码有什么不同 Aircraft Jetpl
  • 实体框架不查询派生类 - DbOfTypeExpression 中的错误

    我有一个基类和两个派生类 每个派生类都实现相同的类型作为属性 唯一的区别是属性名称 遗憾的是我对类设计没有太大影响 gt 它们是从 wsdl 文件生成的 然后我在 BaseType 上有一个属性来封装公共属性 计划是在我的网络视图等中使用此
  • 向图节点添加标签

    我使用 visnetwork 库制作了下图 library tidyverse library igraph set seed 123 n 15 data data frame tibble d paste 1 n relations da
  • 链接“let”语句时使用“and”还是“in”更好?

    我意识到这可能是一个愚蠢的问题 但是 如果我把一堆let不需要需要了解彼此价值观的语句 使用是否更好and or in 例如 以下哪一个更可取 如果有 let a foo and b bar and c baz in etc or let
  • 浮点型、双精度型和十进制最大值与大小的关系[重复]

    这个问题在这里已经有答案了 我在 C 中遇到了这些数据类型的大小和最大值的令人困惑的模式 在使用 Marshal SizeOf 比较这些大小时 我发现了以下结果 Float 4 bytes Double 8 bytes Decimal 16
  • 最后一项具有不同类型的元组(首先从剩余元素开始)

    我有一个类型Foo那是一个Array可以包含任意数量的Bar元素 带有可选的最后一个Qux元素 以下是一些有效数据的示例 bar qux bar qux bar bar bar bar bar bar bar bar qux 无效数据示例
  • Visual Studio 2010 基类扩展编译器错误

    我有一个 C 类 提供一些简单的类和一些基类扩展 例如这个 public static Boolean ToBooleanOrDefault this String s Boolean Default return ToBooleanOrD
  • 如何判断Python对象是否是字符串?

    如何检查 Python 对象是否是字符串 常规字符串或 Unicode Python 2 Use isinstance obj basestring 对于要测试的对象obj Docs https docs python org 2 7 li
  • 为什么 Python 布尔值占用超过一个字节?

    显然 Python 中整数占用 24 个字节 我可以理解 它这样做是因为代表无限数字的额外花哨 然而 布尔数据类型看起来也花费了高达 24 个字节 尽管它只能表示两个可能值之一 为什么 除了 1 位表示之外 还可能需要存储哪些额外数据Tru

随机推荐