【发布时间】:2016-04-09 23:37:44
【问题描述】:
我一直在为 Haskell 使用一些资源:向您学习 Haskell 和 wikibook。但是,我正在努力寻找一种解释来帮助我更多地理解递归。我附上了“Learn you a Haskell”一书中的一段代码示例,我部分理解。
maximum' :: (Ord a) => [a] -> a
maximum' [] = error "maximum of empty list"
maximum' [x] = x
maximum' (x:xs)
| x > maxTail = x
| otherwise = maxTail
where maxTail = maximum' xs
直到最后一行'maxTail = maximum'xs'为止,我都理解上述所有代码。我不明白的是如何评估代码以返回最大值,而只是调用最大值'。或者它如何知道最大值'是列表的最高元素。
另一个例子:
reverse' :: [a] -> [a]
reverse' [] = []
reverse' (x:xs) = reverse' xs ++ [x]
了解所有内容,直到在列表的尾部调用 reverse'。换句话说,它怎么知道reverse'意味着反转尾部元素。
我真的很感激一个解释,如果它很简单,我很抱歉,我是这种语言的新手。
【问题讨论】:
-
reverse'并不意味着“反转尾部元素”。reverse' xs表示“反转尾部元素”,因为xs是尾部元素,reverse'表示反转。 -
请注意,在递归情况下,函数
maximum'和reverse'在给定列表的 tail(即除第一个元素之外的任何元素)上调用,例如maximum' [1,2,3]递归地应用于列表[2,3]。这个想法是整数列表的最大值是 1. 第一个列表元素和 2. 列表其余部分的最大值中的较大值。当通过(x:xs)对列表进行模式匹配时,x是第一个列表元素,xs是其余元素(“尾部”)。 -
“它怎么知道reverse'意味着反转尾部元素。”它没有;但你可以通过归纳来证明。从
[]和[a]案例开始;然后检查[a,b], ....,然后假设它适用于一般的[a,b,...,n]情况,并证明下一个情况[a,b,...,n,m]也正在反转。 -
仅供参考:您可以在这里参观:tour 并快速了解网站和所有功能/特性。
标签: haskell recursion functional-programming