Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function SML:为什么函数总是带一个参数使语言灵活_Function_Sml - Fatal编程技术网

Function SML:为什么函数总是带一个参数使语言灵活

Function SML:为什么函数总是带一个参数使语言灵活,function,sml,Function,Sml,我(从一本SML书籍中)了解到,SML中的函数总是只接受一个参数:元组。接受多个参数的函数只是接受一个元组作为参数的函数,在函数绑定中使用元组绑定实现。我明白这点 但在这之后,这本书说了一些我不明白的事情: 这一点使得SML语言具有灵活性和优雅的设计,您可以做一些在Java中做不到的有用的事情。 为什么这种设计使语言具有灵活性?文本指的是什么,SML可以但java不能?使用元组而不是多个参数增加了灵活性,因为高阶函数可以处理任何“arity”函数。例如,要创建列表[fx,fy,fz],您可以像这

我(从一本SML书籍中)了解到,SML中的函数总是只接受一个参数:元组。接受多个参数的函数只是接受一个元组作为参数的函数,在函数绑定中使用元组绑定实现。我明白这点

但在这之后,这本书说了一些我不明白的事情:

这一点使得SML语言具有灵活性和优雅的设计,您可以做一些在Java中做不到的有用的事情。


为什么这种设计使语言具有灵活性?文本指的是什么,SML可以但java不能?

使用元组而不是多个参数增加了灵活性,因为高阶函数可以处理任何“arity”函数。例如,要创建列表
[fx,fy,fz]
,您可以像这样使用高阶函数
映射

map f [x, y, z]
map f [(x,a), (y,b), (z,c)]
这很简单,你可以用任何语言来做。但是现在让我们考虑<代码> f>代码>实际上需要两个参数。如果
f
是一个真正的二元函数(假设SML有这样的函数),我们需要一个不同版本的
map
,它可以使用二元函数而不是一元函数(如果我们想使用三元函数,我们也需要一个版本)。但是,使用元组,我们可以这样编写:

map f [x, y, z]
map f [(x,a), (y,b), (z,c)]
这将创建列表
[f(x,a),f(y,b),f(z,c)]


PS:并非所有需要多个参数的函数都在SML中使用元组。函数通常使用currying(而不是元组)来表示多个参数,但我想你的书还没有开始使用currying。Curried函数的使用方法与上述方法不同,因此它们在这个意义上并不通用。

事实上,我认为您根本不理解这一点

首先,SML中的函数不接受元组作为参数,它们可以接受任何东西作为参数。有时候,使用元组作为传递多个参数的手段是很方便的。例如,函数可以将记录作为参数、整数、字符串,甚至可以将另一个函数作为参数。也可以说它可以接受“无参数”,因为它可以接受单位作为参数

如果我正确理解了你关于接受你所说的“多个参数”的函数的陈述。比如说

fun add x y = x + y
在SML中,咖喱是作为派生形式(语法糖)实现的。请参阅,以详细了解这实际上是如何工作的。总之,SML中只有匿名函数,但是我们可以将它们绑定到名称,以便它们“引用”/“以后使用”

瞧,漫无边际的闲谈就要开始了

在谈论任何事情的灵活性之前,我想先陈述一下我对它的看法。我非常喜欢这样的定义:“[…]语言中的话语可以以多种方式使用”

在SML的例子中,选择了一种小而简单的核心语言。这使得实现编译器和解释器变得容易。灵活性表现为SML语言的许多功能都是使用这些核心语言功能实现的,例如匿名函数、模式匹配以及SML具有高阶函数的事实。
例如咖喱、大小写表达式、记录选择器、if-the-else表达式、表达式序列

我想说,这使得SML核心语言非常灵活,坦率地说相当优雅


关于SML能做什么,java不能做什么(在本文中),我不太确定作者的想法。但是我很确定作者可能有点偏颇,因为您也可以用java做任何事情。然而,这可能需要大量的编码:)

你可能不想添加你从哪本教科书上获得这一点。当OP说“一个带多个参数的函数只是一个带一个元组作为参数的函数”时,我很确定他说的是
有趣的添加(x,y)=x+y
,看起来(给来自其他语言的人)就像一个包含两个参数的函数,但实际上只包含一个元组。我认为他根本不知道如何使用curry。@sepp2k,你可能是对的。我可能已经得出了结论。但是最初的问题很难理解,也很难理解。在SML中,所有函数都是单参数函数。是的,在SML中,函数可以包含一个整数,字符串或任何其他函数。但它们实际上是元组。例如,您可能会说函数
fun add\u by_one(x)=x+1
采用整数,但我认为,即使函数具有类型
int->int
,您也忽略了元组的类型具有单个整数的事实(例如
(1)
)也是
int
。如果有一个函数接受两个int并返回一个int,那么该函数的类型是
int*int->int
,其中
int*int
是一个元组。所有SML函数都是单参数函数,它们都将元组作为参数。另外,请注意元组是带有字段的记录的语法糖按顺序1,2,3。。。