【发布时间】:2022-10-09 09:44:01
【问题描述】:
这些问题在一般情况下要多做一些关于如何递归思考的问题,但我会举一个具体的例子来说明。
Graham Hutton 在视频中解释了函数mSort:
https://youtu.be/I9S61BYM9_4?t=2089
因此,在我在视频中链接的特定点上,教授说:
在这里,我有两个排序列表:
msort :: [Int] -> [Int] msort [] = [] msort [x] = [x] msort xs = (msort ys) (msort zs) where (ys, zs) = halve xs并突出显示表达式
(msort ys)和(msort zs)。然后,他在这些表达式前面添加了单词merge。msort :: [Int] -> [Int] msort [] = msort [] msort [x] = msort [x] msort xs = merge (msort ys) (msort zs) where (ys, zs) = halve xs对我来说,似乎有一些假设,类似于逻辑中的假设,例如“如果这个假设场景是真的,那么(推导出一些陈述)”。这些对于考虑递归很有用,但与递归函数的评估无关。所以,我的问题是:
- 当
msort尚未完全定义时,他怎么能谈论msort ys?- 当然,那里写的所有东西都没有任何神奇的意义。但是选择的词是否仅有助于推理功能?我在问,因为他谈到
msort ys是一个“排序列表”。他使用过去时。- 这是否假设
halve将以合理的方式定义?同样,halve只是一个名称。如果这些真的是基本问题,我深表歉意。这是我最近才开始疑惑的事情。
【问题讨论】:
-
我试着回答你的问题,但如果答案没有帮助,你是否对技术的允许我们编写在完全定义之前调用自己的函数的机制?就像,计算机实际上是如何做这个?
-
太感谢了。你的回答很有帮助。我不是想知道技术机制,而是用于交流和思考这类事情的约定。