Functional programming 如何在SML的整个程序中保持列表中的元素?

Functional programming 如何在SML的整个程序中保持列表中的元素?,functional-programming,sml,smlnj,Functional Programming,Sml,Smlnj,假设我必须在每次调用函数时更新一个列表,这样列表中的前一个元素就会被保留 以下是我的尝试: local val all_list = []; in fun insert (x:int) : string = int2string (list_len( ((all_list@[x])) ) ) end; 问题是,每次调用insert时,我都会得到输出“1”,这表示列表再次启动到[] 然而,我希望第一次调用insert的输出是“1”,第二次调用的输出是“2”,等等 我无法找到解

假设我必须在每次调用函数时更新一个列表,这样列表中的前一个元素就会被保留

以下是我的尝试:

local 
    val all_list = [];
in
    fun insert (x:int) : string  = int2string (list_len( ((all_list@[x])) ) )
end;
问题是,每次调用insert时,我都会得到输出“1”,这表示列表再次启动到
[]

然而,我希望第一次调用insert的输出是
“1”
,第二次调用的输出是
“2”
,等等


我无法找到解决办法。应该如何做?

值在SML中是不可变的<代码>插入是在
所有列表
的值为
[]
的上下文中定义的,并且代码的任何内容都不会更改该值

all_list@[x] 
不改变值
all\u list
——它返回一个全新的列表,您的代码会立即丢弃该列表(在计算其长度后)


使用引用类型(SML不纯的特性之一)可以完成您似乎想做的事情,但生成的代码不是惯用的SML。它将破坏引用透明性(函数式编程语言的理想特性,即使用相同的输入调用函数会产生相同的输出)。

值在SML中是不可变的<代码>插入是在
所有列表
的值为
[]
的上下文中定义的,并且代码的任何内容都不会更改该值

all_list@[x] 
不改变值
all\u list
——它返回一个全新的列表,您的代码会立即丢弃该列表(在计算其长度后)

使用引用类型(SML不纯的特性之一)可以完成您似乎想做的事情,但生成的代码不是惯用的SML。这将破坏引用透明性(函数式编程语言的理想特性,即使用相同的输入调用函数会产生相同的输出)。

您需要使用。 大多数时候,函数式程序员更喜欢使用它,因为它没有副作用。您的实现是一个纯函数,因此它总是为相同的输入返回相同的值(在您的情况下,它为任何输入返回相同的值)

你可以通过引用来处理这个问题

标准ML参考资料速成班:

  • 使用
    ref
    创建一个新的引用,
    ref
    具有类型
    'a->'a ref
    ,因此它将任意值打包到一个引用单元格中,您可以稍后修改该单元格
  • 用于解压缩引用:
    (!):'a ref->'a
    ,在大多数命令式语言中,此操作是隐式的,但在SML或OCaml中不是
  • (:=):'a ref*'a->unit
    是一个用于修改引用的中缀运算符,下面是如何递增整数引用的内容:
    r:=!r+1
上面给出了以下代码(我将
x
s预先添加到列表中,而不是附加它们):

你需要使用。 大多数时候,函数式程序员更喜欢使用它,因为它没有副作用。您的实现是一个纯函数,因此它总是为相同的输入返回相同的值(在您的情况下,它为任何输入返回相同的值)

你可以通过引用来处理这个问题

标准ML参考资料速成班:

  • 使用
    ref
    创建一个新的引用,
    ref
    具有类型
    'a->'a ref
    ,因此它将任意值打包到一个引用单元格中,您可以稍后修改该单元格
  • 用于解压缩引用:
    (!):'a ref->'a
    ,在大多数命令式语言中,此操作是隐式的,但在SML或OCaml中不是
  • (:=):'a ref*'a->unit
    是一个用于修改引用的中缀运算符,下面是如何递增整数引用的内容:
    r:=!r+1
上面给出了以下代码(我将
x
s预先添加到列表中,而不是附加它们):


在函数式编程中,使用相同的输入重复调用函数将重复给出相同的结果。为什么会有其他的预期呢?您永远不会更新变量(而且您不能!)。你只是在创建一个新的列表,然后确定其长度。我可以推荐阅读R.哈珀的作品。真是一本好书!在函数式编程中,使用相同的输入重复调用函数将重复给出相同的结果。为什么会有其他的预期呢?您永远不会更新变量(而且您不能!)。你只是在创建一个新的列表,然后确定其长度。我可以推荐阅读R.哈珀的作品。真是一本好书!