SML 语法分解
SML Syntax Breakdown
我正在尝试学习 SML(为了完全透明,这是在准备考试(考试尚未开始)),我一直在努力学习的一个领域是高级功能,例如地图和 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;
因此,如果我可以分解我看到的部分并突出显示我正在努力处理的部分,我相信这会有所帮助。
显然你马上就知道了函数的名称和传入的参数,但我对这部分有一个问题是为什么我们只是将一个变量传递给 cubiclist 但至少我们传递了(x::xs)?是因为地图函数自动将函数应用于地图中的每个部分吗?此外,fold 函数通常会采用 x::xs 参数,而 map 只会采用变量?
然后我们有高阶函数和匿名函数以及我们想要应用于列表中每个元素的 logic/operations。但是我不太确定为 foldr 匿名函数传递的参数。我知道我们正在尝试捕获列表中最低的元素,并且 then a else b
返回 a 或 b 以与列表中的其他元素进行比较。我很确定在未来的比较中它们已经过时并被视为 a
,但是我们从哪里得到以下 b
?我们在哪里说 b
是列表中的下一个元素?
然后我实在不明白也没有头绪的部分就是各自函数末尾的L;
和x xs;
。他们为什么在那里?他们在做什么?他们的目的是什么?它只是语法还是实际上有它们存在的目的,并不是说语法不是目的或正当理由,而是它们实际上做了什么吗?那些变量是否可以用提供不同答案的其他东西来改变?
非常感谢help/explanation。
map
接受一个函数和一个列表并生成一个新列表。
在map (fn x=> x*x*x) L
中,函数是fn x=> x*x*x
,L
是列表
此列表与 cubiclist
的参数列表相同。
foldr
接受一个函数、一个初始值和一个列表,并产生某种值。
在foldr (fn (a,b) => if (a < b) then a else b) x xs
中,函数为fn (a,b) => if (a < b) then a else b
,初始值为x
,列表为xs
.
x
和 xs
通过模式匹配赋予函数; x
是参数的头部,xs
是参数的尾部。
(由此可见,如果给定一个空列表,min
将失败。)
除了@molbdnilo 已经说明的内容之外,对于函数式编程的新手来说,考虑一下我们在创建循环时实际在做什么可能会有所帮助:我们正在指定一段代码 运行 反复。我们需要一个初始状态,一个循环终止的条件,以及每次迭代之间的更新。
让我们看一下地图的简单实现。
fun map f [] = []
| map f (x :: xs) = f x :: map f xs
- 列表内容的初始状态。
- 终止条件是列表为空。
- 更新是我们将
f x
附加到映射结果的前面 f
到列表的其余部分。
map的用处在于我们抽象掉了f
。它可以是任何东西,我们不必担心编写循环样板文件。
与过程语言中的循环相比,折叠函数更复杂也更有指导意义。
折叠的简单实现。
fun foldl f init [] = init
| foldl f init (x :: xs) = foldl f (f init x) xs
- 我们明确提供了一个初始值和一个要操作的列表。
- 终止条件是列表为空。如果是,我们return提供初始值。
- 更新是再次调用函数。这次更新初始值,列表是原来的尾部。
考虑对整数列表求和。
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
理解折叠很重要,因为可以根据 foldl 或 foldr 实现许多基本功能。将折叠视为减少 (许多编程语言将这些函数称为“减少”) 列表到某种类型的另一个值的一种方法。
我正在尝试学习 SML(为了完全透明,这是在准备考试(考试尚未开始)),我一直在努力学习的一个领域是高级功能,例如地图和 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;
因此,如果我可以分解我看到的部分并突出显示我正在努力处理的部分,我相信这会有所帮助。
显然你马上就知道了函数的名称和传入的参数,但我对这部分有一个问题是为什么我们只是将一个变量传递给 cubiclist 但至少我们传递了(x::xs)?是因为地图函数自动将函数应用于地图中的每个部分吗?此外,fold 函数通常会采用 x::xs 参数,而 map 只会采用变量?
然后我们有高阶函数和匿名函数以及我们想要应用于列表中每个元素的 logic/operations。但是我不太确定为 foldr 匿名函数传递的参数。我知道我们正在尝试捕获列表中最低的元素,并且 then a else b
返回 a 或 b 以与列表中的其他元素进行比较。我很确定在未来的比较中它们已经过时并被视为 a
,但是我们从哪里得到以下 b
?我们在哪里说 b
是列表中的下一个元素?
然后我实在不明白也没有头绪的部分就是各自函数末尾的L;
和x xs;
。他们为什么在那里?他们在做什么?他们的目的是什么?它只是语法还是实际上有它们存在的目的,并不是说语法不是目的或正当理由,而是它们实际上做了什么吗?那些变量是否可以用提供不同答案的其他东西来改变?
非常感谢help/explanation。
map
接受一个函数和一个列表并生成一个新列表。
在map (fn x=> x*x*x) L
中,函数是fn x=> x*x*x
,L
是列表
此列表与 cubiclist
的参数列表相同。
foldr
接受一个函数、一个初始值和一个列表,并产生某种值。
在foldr (fn (a,b) => if (a < b) then a else b) x xs
中,函数为fn (a,b) => if (a < b) then a else b
,初始值为x
,列表为xs
.
x
和 xs
通过模式匹配赋予函数; x
是参数的头部,xs
是参数的尾部。
(由此可见,如果给定一个空列表,min
将失败。)
除了@molbdnilo 已经说明的内容之外,对于函数式编程的新手来说,考虑一下我们在创建循环时实际在做什么可能会有所帮助:我们正在指定一段代码 运行 反复。我们需要一个初始状态,一个循环终止的条件,以及每次迭代之间的更新。
让我们看一下地图的简单实现。
fun map f [] = []
| map f (x :: xs) = f x :: map f xs
- 列表内容的初始状态。
- 终止条件是列表为空。
- 更新是我们将
f x
附加到映射结果的前面f
到列表的其余部分。
map的用处在于我们抽象掉了f
。它可以是任何东西,我们不必担心编写循环样板文件。
与过程语言中的循环相比,折叠函数更复杂也更有指导意义。
折叠的简单实现。
fun foldl f init [] = init
| foldl f init (x :: xs) = foldl f (f init x) xs
- 我们明确提供了一个初始值和一个要操作的列表。
- 终止条件是列表为空。如果是,我们return提供初始值。
- 更新是再次调用函数。这次更新初始值,列表是原来的尾部。
考虑对整数列表求和。
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
理解折叠很重要,因为可以根据 foldl 或 foldr 实现许多基本功能。将折叠视为减少 (许多编程语言将这些函数称为“减少”) 列表到某种类型的另一个值的一种方法。