Haskell间隔插入字符代码中func2、func3函数逻辑求解
Haskell代码逻辑解释
func2 运行逻辑
func2 :: Int -> [a] -> [a] func2 _ [] = [] func2 n xs@(_:xs') | n > 0 = func2 (n-1) xs' | otherwise = xs
func2的功能和标准库的drop函数完全一致:跳过输入列表的前n个元素,返回剩余的子列表。
逐行逻辑说明:
- 类型签名表示:输入一个整数参数n、一个任意元素类型的列表[a],返回同类型的列表[a]
- 第一个分支是边界处理:如果输入列表为空,不管n取值是什么,直接返回空列表
- 第二个分支用了
@的as语法:将当前输入的整个列表绑定到变量xs,同时拆分列表为头元素(直接丢弃不处理)和剩余尾列表xs'- 若n>0:说明还没跳够n个元素,将n减1后,递归处理剩余尾列表xs'
- 若n≤0:说明已经跳过了n个元素,直接返回当前列表xs即可
举个运行示例:func2 3 [1,2,3,4,5] 会递归跳过前3个元素,最终返回[4,5]。
func3 运行逻辑
func3 xs 0 y = xs func3 [] n y = [] func3 xs n y | func1 xs < n = xs | otherwise = n `take` xs ++ [y] ++ func3 (drop n xs) n y
func3就是实现每隔n个元素插入指定字符的核心逻辑,你已知func1的作用是取列表长度,这里不再额外说明。
逐行逻辑说明:
- 第一个分支是边界处理:如果间隔长度n设为0,不需要做任何插入操作,直接返回原列表
- 第二个分支是边界处理:如果待处理的列表已经为空,直接返回空
- 第三个分支是正常处理逻辑:
- 如果当前剩余列表的长度小于间隔n,没有足够的元素可以截取,直接返回剩余列表即可
- 如果剩余列表长度≥n,就做三部分内容的拼接:
- 用
take n xs截取当前列表的前n个元素 - 拼接要插入的元素y(包装为单元素列表才能和前后列表拼接)
- 递归调用func3,处理截取完前n个元素后剩下的列表,保持间隔n和插入元素y的参数不变
- 用
举个运行示例:func3 "abcdefg" 2 '-'的最终返回结果是"ab-cd-ef-g"。
内容的提问来源于stack exchange,提问作者user15018248
相关产品推荐
相关产品推荐

