NuN*_*uNu 5 haskell functional-programming
我正在自学 Haskell 并且我在我的书中遇到了一个问题,该问题要求我定义一个函数 insert ,它接受一个正整数n、 elementy和一个列表xs,该列表在列表中的y每个n元素之后插入指定的元素。
我相信模式匹配可能是一个很好的方法,但我还没有真正理解它的含义
insert :: Int -> Char -> [a] -> [a]
insert 0 y xs = xs
insert n y [] = []
insert n y (x:xs)
Run Code Online (Sandbox Code Playgroud)
该函数应如何工作的示例:
insert 2 'X' "abcdefghijk" = "abXcdXefXghXijXk"
Run Code Online (Sandbox Code Playgroud)
在这一点上,我已经处理了基本案例,但我不知道如何从这里开始。
有任何想法吗?谢谢
在最后一种情况下,获取列表的 n 个元素,插入 y 的单例列表,然后在删除列表的前 n 个元素后追加递归调用该函数的结果。
insert :: Int -> Char -> [a] -> [a]
insert 0 y xs = xs
insert n y [] = []
insert n y xs
| length xs < n = xs
| otherwise = take n xs ++ [y] ++ insert n y (drop n xs)
Run Code Online (Sandbox Code Playgroud)
您可以编写一个辅助函数,该函数会倒计时并在为零时重置。
\n\ninsert :: Int -> a -> [a] -> [a]\ninsert n y xs = countdown n xs where\n countdown 0 xs = y:countdown n xs -- reset to original n\n countdown _ [] = []\n countdown m (x:xs) = x:countdown (m-1) xs\nRun Code Online (Sandbox Code Playgroud)\n\n如果需要在末尾插入,您想要什么行为?\n这里我通过将 放在countdown 0 xs之前来优先考虑插入而不是完成countdown _ []。\n如果您想跳过最后的插入,您如何重写它?
使用示例:
\n\n*Main> insert 3 \'|\' "Hello Mum, erm... can I borrow \xc2\xa320000 please?"\n"Hel|lo |Mum|, e|rm.|.. |can| I |bor|row| \xc2\xa32|000|0 p|lea|se?|"\nRun Code Online (Sandbox Code Playgroud)\n