我在练习时遇到问题,我应该定义一个函数,它将整数,字符和字符串作为输入,并返回将字符放入字符串中由整数指定的位置的结果,例如,给出3,'a'和"haskell"该功能应该导致"hasakell".
putinto :: Int -> Char -> String -> String
putinto
Run Code Online (Sandbox Code Playgroud)
以这种方式考虑:有一个列表,其中第一个元素被称为'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)
你仍然需要关心错误检查(如果给定的位置是负的,或者大于列表长度怎么办?).