递归函数

ste*_*ven 1 recursion haskell

我在练习时遇到问题,我应该定义一个函数,它将整数,字符和字符串作为输入,并返回将字符放入字符串中由整数指定的位置的结果,例如,给出3,'a'"haskell"该功能应该导致"hasakell".

putinto :: Int -> Char -> String -> String
putinto
Run Code Online (Sandbox Code Playgroud)

Fre*_*abe 6

以这种方式考虑:有一个列表,其中第一个元素被称为'x',列表的其余部分被称为'xs'(在Haskell中,这将被写为(x:xs)),您可以将给定值添加到列表中该位置为0.否则,您可以递归调用列表的剩余部分(并减少poisition).

putinto :: Int -> a -> [a] -> [a]
putinto 0 value list   = value : list
putinto n value (x:xs) = x : putinto (n-1) value xs
Run Code Online (Sandbox Code Playgroud)

如果它看起来很奇怪,那(x:xs)实际上是一个"解构"列表.的x表示列表的第一个元素,xs(所述的"是指"多个",所以它的"x"的复数)是列表的其余部分.

所以用零调用它实际上会预先给定给定的值,如

putinto 0 'a' "haskell"  -- yields 'ahaskell'
Run Code Online (Sandbox Code Playgroud)

用两个调用它将是:

putinto 2 'a' "haskell"
-- same as 'h' : putinto 1 'a' "askell"
-- same as 'h' : 'a' : putinto 0 'a' "skell"
-- same as 'h' : 'a' : 'a' : "skell"
-- same as "haaskell"
Run Code Online (Sandbox Code Playgroud)

你仍然需要关心错误检查(如果给定的位置是负的,或者大于列表长度怎么办?).