Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >OCaml -向该列表添加一个包含元组列表的新元组

OCaml -向该列表添加一个包含元组列表的新元组
EN

Stack Overflow用户
提问于 2012-11-07 21:22:10
回答 1查看 7.8K关注 0票数 3

我正在用OCaml编写一个带有一些简单命令的交互式计算器。例如,用户应该能够定义他们自己的简单函数(数学函数

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let f(x) = x
let g(x) = 2*f(x)

现在,函数应该像函数式语言一样处理,这意味着它们应该记住创建时的环境。这意味着,对于一个函数,我必须保持它的环境的闭包,这就是函数和变量。

我将当前定义的函数保存在元组列表中,这些元组的格式类似于(functions_present_at_the_time_of_creation, variables_present_at_the_time_of_creation, function_name, function_argument_names, function_formula)。当我尝试将一个新函数添加到函数列表中时(假设它当前没有定义,并且我不需要覆盖任何内容),我会递归地迭代到函数列表的末尾,并且希望添加一个新的元组。

问题是,假设我当前的函数列表的类型是(a*b*c*d*e) list,当我试图将一个带有自身的元组添加到它的末尾时,它将它的类型更改为((a*b*c*d*e) list*f*g*h*i) list。我能做些什么才能将列表封装在元组中,将列表添加到列表本身?

以下是我在尝试找到解决此问题的方法时编写的一些简单的SSCCE。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let rec add_to_end list list_copy dummy = match list with
| [] -> [(list_copy, dummy)]
| h::t -> h::(add_to_end t list_copy dummy) 

let add list dummy = add_to_end list list dummy

这个人试图用列表的副本来做这件事。下面的示例没有使用副本(当然,这两个示例都不起作用):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let rec add_to_end list dummy = match list with
| [] -> [(list, dummy)]
| h::t -> h::(add_to_end t dummy) 

当尝试使用函数add时,第一个示例不起作用,但例如这样做时(在解释器中):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
let l = [];;
let l = add_to_end l l 1;;
let l = add_to_end l l 2;;
let l = add_to_end l l 3;;

那么它工作得很好。我很感谢任何帮助,我可能会考虑改变设计,任何建议都是非常受欢迎的。

编辑:以下是上述命令的输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# let l = [];;
val l : 'a list = []
# let l = add_to_end l l 1;;
val l : ('a list * int) list = [([], 1)]
# let l = add_to_end l l 2;;
val l : (('a list * int) list * int) list = [([], 1); ([([], 1)], 2)]
# let l = add_to_end l l 3;;
val l : ((('a list * int) list * int) list * int) list =
[([], 1); ([([], 1)], 2); ([([], 1); ([([], 1)], 2)], 3)]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-07 21:35:47

很难说您是否知道OCaml列表是不可变的。不能将值添加到现有列表的末尾。现有列表永远不能更改。您可以创建一个新列表,并在列表末尾添加一个值。如果这样做,我不明白为什么要在末尾添加一个由列表和新值组成的对。我怀疑你想错了。下面是一个函数,它接受一个列表和一个整数,并将该整数添加到列表的末尾。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# let rec addi i list =
    match list with
    | [] -> [i]
    | h :: t -> h :: addi i t
  ;;
val addi : 'a -> 'a list -> 'a list = <fun>
# let x = [1;2;3];;
val x : int list = [1; 2; 3]
# addi 4 x;;
- : int list = [1; 2; 3; 4]
# x;;
- : int list = [1; 2; 3]
# 

该函数返回一个新列表,并将值添加到列表的末尾。原始列表不会更改。

顺便说一句,在列表的前面添加值要习惯得多。重复地添加到列表的末尾是很慢的--它会产生二次行为。如果您想要另一种顺序,通常要做的是将所有内容添加到前面,然后反转列表--这仍然是线性的。

编辑

显然,您确实想要一个如下所示的函数:

设f a list = list @ (list,a)

这在现实中是不可能的,类型不能正常工作。一个列表只能包含一种类型的内容。所以你可以得出结论,列表t的类型与类型(t, v) list相同,其中v是a的类型。这是一个递归类型,而不是你真正想要使用的类型(IMHO)。

实际上,您可以使用-rectypes在OCaml中获取此类型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ ocaml -rectypes
        OCaml version 4.00.0

# let f a list = list @ [(list, a)];;
val f : 'a -> (('b * 'a as 'c) list as 'b) -> 'c list = <fun>
# 

但是(正如我所说的)这是我会避免的事情。

编辑2

现在我来看一下,您的第一个代码示例避免了需要递归类型,因为您指定了列表的两个不同副本。除非您使用相同的列表调用函数,否则它们可能是不同的类型。所以函数类型不是递归的。当您使用同一列表的两个副本进行调用时,您将创建一个类型与列表类型不同的新值。它之所以有效,是因为您对不同的值(具有不同的类型)使用了相同的名称l。这在真正的程序中是行不通的,因为在真正的程序中,你需要一个类型来表示你的列表。

作为另一个附注:在列表的开头添加值的美妙之处在于列表的旧值仍然存在。这是新列表的尾部。这看起来更接近你真正想要做的事情。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13278457

复制
相关文章
Python列表与元组
阅读文本大概需要 4.8 分钟 写在前面 经过一周的学习与试错,到现在基本上已经能够熟练掌握公众号的各项功能以及排版上的一些技巧了。从开始时的笨手笨脚,到现在略微的小有成就,说明其实每一天都在进步。 也许每一天的进步看起来可能微乎其微,但是坚持下来呢?如果以月、以年、以一生为单位的话会怎样呢? 今天在这里立个flag,一方面督促自己更好地坚持创作分享,和大家一起见证此公号的成长;另一方面也希望能给大家带来一些思考,开始着手于做自己感兴趣的事情。 分享给大家一句话:「当你决定好要做一件事情的时候那就开始吧,
Python技术与生活认知的分享
2018/07/03
7900
python列表、元组(三)
一、列表 1. 创建列表 >>> name = ['gao', 'sam', 'snow', 'jey'] >>> type(name) <type 'list'> >>> name=list(['gao', 'sam', 'snow', 'jey'])   # python 3.0+ 会报错 >>> type(name) <type 'list'> >>> name = [] >>> type(name) <type 'list'> >>> name = list()   # python 3.0+ 会报
py3study
2020/01/13
5010
python 元组列表排序
data = [(1, 'B'), (1, 'A'), (2, 'A'), (0, 'B'), (0, 'a')]
用户5760343
2019/07/07
1.1K0
python列表、元组、字典
列表是由一序列特定顺序排列的元素组成的。可以把字符串,数字,字典等都可以任何东西加入到列表中,列表中的元素之间没有任何关系。列表也是自带下标的,默认也还是从0开始。列表常用方括号表示,即:[],元素用逗号隔开。
py3study
2020/01/15
1.2K0
Python中列表和元组该怎么选?
列表(list)和元组(tuple)是 Python 中两种重要的数据结构。列表和元组之间有相似的地方也有不同的地方,了解两者的异同可以更好的使用它们,下面我们便对列表和元组做一个比较。
mr.songw
2021/01/14
1.5K0
Python中列表和元组该怎么选?
python---列表、元组
列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储、修改等操作。
py3study
2020/01/06
5040
Python列表之元组
cmp    比较2个序列,返回值是一个整数  x==y 0 | x>y 返回正数
py3study
2020/01/14
6210
Python列表与元组
变量只能存一个数据,而集合能存储一组数据。本节我们来介绍两种Python中最常见的数据结构:列表与元组
小雨coding
2020/06/30
2.2K0
python 元组的列表排序
random = [(2, 2), (3, 4), (4, 1), (1, 3)]
用户5760343
2019/07/05
1.3K0
python的元组和列表
慕课网 首发了,放在垂直领域吧。简书备份。 在python中,最基本的数据类型就是序列。序列表示一系列有序的元素,列表,元组,字符串是python最常见的序列。 序列中每一个元素都会被分配一个序号,即元素的位置,也被称为index。所有的序列都可以进行某些操作,包括索引,分片,加,减,以及检查某个元素是否属于序列的成员。 元祖 a=[1,2,3,4,5] print(a[0:len(a):2]) print(a[-1::-1]) print(a[2:]) [1, 3, 5] [5, 4, 3, 2, 1
热心的社会主义接班人
2018/04/27
1.5K0
Python 学习之元组列表
Python 的元组与列表类似,不同之处在于元组的元素不能修改。 元组使用小括号,列表使用方括号。 Tuple tuple 用小括号或者无括号来表示,是一连串有顺序的数字。 a_tuple = (12,3,5,15,6) another_tuple = 12,3,5,15,6 print(a_tuple) print(another_tuple) """ (12, 3, 5, 15, 6) (12, 3, 5, 15, 6) """ List list 是用中括号命名 a_list=[12,3,5,1
Python技术与生活认知的分享
2018/08/01
4810
Python列表、元组、字典操作
#!/usr/bin/python # -*- coding: UTF-8 -*- list1 = [1,2,'a', 'b'] seq = (1,4,5) print list1[2] #获取第三个元素(下标是从0开始) print list1[-3] #获取倒数第三个元素 print list1[2:] #获取第三个元素到最后一个 print len(list1) #获取列表元素个数 print max(list1) #获取最大的元素 print min(list1) #
苦咖啡
2018/04/28
1.7K0
python之列表、元组、字典
3 深拷贝和浅拷贝 1 浅拷贝: 当列表中存在有个列表时,其修改这个列表中列表的某一个元素时,其他被拷贝的列表中的对应元素也将被拷贝,其在拷贝这个列表中的列表时,拷贝的是这个内嵌列表的内存位置。
py3study
2020/01/14
2.8K0
Python 列表&元组&字典&集合
列表(list) 有序性,可存储任意类型的值 通过偏移存取,支持索引来读取元素,第一个索引为0 ,倒数第一个索引为-1 可变性 ,支持切片、合并、删除等操作 可通过索引来向指定位置插入元素 可通过pop()方法删除末尾元素,pop(索引位置)来删除指定位置元素 替换元素可直接通过赋值给对应的的索引位置 1 classMates = ['zhangsan','lisi','wangwu'] 2 print(classMates[0]) #通过索引来获取元素 3 print(classMates[-1]
py3study
2020/01/19
1.3K0
3-序列、列表、元组
序列就是一堆数据元素的集合,并对每个元素进行编号。在Python中,字符串、列表、元组都属于序列,他们都具有一些特定的操作,如索引、切片、相加、相乘、in、长度、最大值和最小值。
用户3106371
2018/09/12
7660
Python07 列表、元组
可以看到name2没有因为name1的修改而改变,name2根据定义的变量位置,从上到下取最近的name1来copy
py3study
2020/01/08
5950
python_列表_元组_字典
insert(index, object) 在指定位置index前插入元素object
以某
2023/03/07
2.3K0
python_列表_元组_字典
python基本语法:列表(列表和元组的区别)
3.列表类似于java中的list. 与元组不同,定义单个元素对象时不用加逗号,且元素值可改变。
微风-- 轻许--
2022/04/13
1.3K0
python基本语法:列表(列表和元组的区别)
Python 元组转换为列表
结论:当给定一个可迭代对象(如列表、元组、集合、范围等)时,list() 和 tuple() 返回一个新的列表和元组
Python学习者
2023/07/17
2770
Python 列表(元组)的count函数
列表(元组)的count函数 功能 返回当前列表中某个成员的个数 用法 inttype = list.count(item) 参数 item : 你想查询个数的元素 注意事项 如果查询的成员(元素)不存在,则返回 0 列表只会检查完整元素是否存在需要计算的内容 列表和元组的count是一致的 代码 # coding:utf-8 animals = ['小猫', '小狗', '龙猫', '小猫', '鹦鹉', '小狗', '小兔子', '小猫'] cat = animals.count('小猫')
Zkeq
2022/05/18
8770

相似问题

OCAML -向元组列表添加元组

114

向python中的新元组添加元组列表

17

Ocaml打印元组列表

232

向元组列表添加常量元组值

51

在OCaml中将元组列表转换为列表元组

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文