Syntax SML语法分解

Syntax SML语法分解,syntax,sml,higher-order-functions,smlnj,Syntax,Sml,Higher Order Functions,Smlnj,我正在努力学习SML(为了完全透明,这是在为考试做准备(考试还没有开始)),我一直在努力的一个领域是更高级别的功能,如map和foldl/r。我知道它们用于在oop语言中使用for循环的情况(我认为)。但我正在努力解决的是折叠或贴图函数中的每个部分都在做什么。这里有一些例子,如果有人能把它们分解,我将非常感激 fun cubiclist L = map (fn x=> x*x*x) L; fun min (x::xs) = foldr (fn (a,b) => if (a <

我正在努力学习SML(为了完全透明,这是在为考试做准备(考试还没有开始)),我一直在努力的一个领域是更高级别的功能,如map和foldl/r。我知道它们用于在oop语言中使用for循环的情况(我认为)。但我正在努力解决的是折叠或贴图函数中的每个部分都在做什么。这里有一些例子,如果有人能把它们分解,我将非常感激

fun cubiclist L = map (fn x=> x*x*x) L;

fun min (x::xs) = foldr (fn (a,b) => if (a < b) then a else b) x xs;
fun cubiclist L=map(fn x=>x*x*x)L;
fun-min(x::xs)=foldr(fn(a,b)=>如果(a
因此,如果我能分解我看到的部分,并高光照我正在努力的部分,我相信这将是有益的

很明显,一开始你就知道要传入的函数和参数的名称,但在这一部分我有一个问题,为什么我们只传入一个变量到cubiclist,而对于min,我们传入(x::xs)?是否因为地图功能自动将该功能应用于地图中的每个部分?此外,fold函数通常会接受x::xs参数,而map只接受一个变量

然后我们有了高阶函数和匿名函数,以及我们想要应用于列表中每个元素的逻辑/操作。但是传递给foldr匿名函数的参数我不太确定。我知道我们正试图捕获列表中最低的元素,
然后a else b
返回a或b以与列表中的其他元素进行比较。我很确定,在未来的比较中,它们会被重新定义并被视为
a
,但我们从何处获得以下
b
?我们在哪里说
b
是列表中的下一个元素

那么我真正不懂也不知道的部分就是
L
xxs位于各个功能的末尾。他们为什么在那里?他们在做什么?他们的目的是什么?这仅仅是语法,还是它们存在的真正目的,不是说语法不是目的或有效的理由,而是它们真的做了些什么吗?这些变量是否可以用其他变量进行更改,从而提供不同的答案


非常感谢您提供的任何帮助/解释。

map
接受一个函数和一个列表,并生成一个新列表

map(fnx=>x*x*x)L
中,函数是
fnx=>x*x
,而
L
是列表。
此列表与
cubiclist
的参数相同

foldr
接受函数、初始值和列表并生成某种值

foldr(fn(a,b)=>if(a
中,函数为
fn(a,b)=>if(a
,初始值为
x
,列表为
xs

通过模式匹配将
x
xs
赋予函数
x
是参数的头部,
xs
是参数的尾部。

(由此可知,如果给它一个空列表,
min
将失败。)

map
获取一个函数和一个列表,并生成一个新列表

map(fnx=>x*x*x)L
中,函数是
fnx=>x*x
,而
L
是列表。
此列表与
cubiclist
的参数相同

foldr
接受函数、初始值和列表并生成某种值

foldr(fn(a,b)=>if(a
中,函数为
fn(a,b)=>if(a
,初始值为
x
,列表为
xs

通过模式匹配将
x
xs
赋予函数
x
是参数的头部,
xs
是参数的尾部。

(由此可知,如果给它一个空列表,
min
将失败。)

除了@molbdnilo已经说过的内容之外,对于函数式编程的新手来说,思考我们在编写循环时实际在做什么是有帮助的:我们正在指定一段代码来重复运行。我们需要初始状态、循环终止的条件以及每次迭代之间的更新

让我们看看map的简单实现

fun map f [] = []
  | map f (x :: xs) = f x :: map f xs
  • 列表内容的初始状态
  • 终止条件为列表为空
  • 更新内容是,我们将
    fx
    钉在将
    f
    映射到列表其余部分的结果的前面
map的用处在于我们把
f
抽象出来。它可以是任何东西,我们不必担心编写循环样板文件

与过程语言中的循环相比,Fold函数更复杂,也更具指导性

fold的一个简单实现

fun foldl f init [] = init
  | foldl f init (x :: xs) = foldl f (f init x) xs
  • 我们显式地提供了一个初始值和一个要操作的列表
  • 终止条件是列表为空。如果是,则返回提供的初始值
  • 更新是再次调用该函数。这一次将更新初始值,列表是原始值的尾部
考虑对整数列表求和

foldl op+ 0 [1,2,3,4]
foldl op+ 1 [2,3,4]
foldl op+ 3 [3,4]
foldl op+ 6 [4]
foldl op+ 10 []
10

了解FOLD很重要,因为许多基本功能都可以用foldl或foldr实现。可以将折叠看作是将列表缩减为某种类型的另一个值的一种方法(许多编程语言将这些函数称为“reduce”)。

除了@molbdnilo已经说明的内容之外,对于函数式编程的新手来说,当我们构建一个循环时,思考一下我们实际在做什么是很有帮助的:我们指定了一段要重复运行的代码。我们需要初始状态、循环终止的条件以及每次迭代之间的更新