我试图创建一个将列表中的部分字符串连接到另一个字符串的函数。我已经知道如何选择我想要的字符串,但现在我需要它们的第一部分(并且它并不总是相同的值)。
所以我想剪掉一个字符串的第一部分
-- here is a function who should take a string and the numbers
-- of characters we want to take from the start
cutString :: Int -> String -> String
cutString x str = cut x str -- here's a way to take the first x characters
以及使用它的方式:
print (cutString 3 "Hello World")
Output --> "Hel"
有没有简单的方法可以做到这一点?
感谢您提供任何帮助或建议。
答案 0 :(得分:5)
请参阅take
:
take :: Int -> [a] -> [a]
应用于列表take n
的
xs
会返回长度为xs
的{{1}}前缀,如果n
<则返回xs
本身的前缀/ p>
在Prelude中使用它显示:
n > length xs
答案 1 :(得分:2)
您可以使用显式递归自己实现take
:
-- note the signature here is less general than it need be:
-- cutString :: Int -> [a] -> [a]
cutString :: Int -> String -> String
cutString 0 _ = []
cutString n (x:xs)
| n > 0 = x : cutString (n-1) xs
| otherwise = []
cutString _ _ = []
第一个轮换是你通常的基本情况 - 任何东西的零元素都是空字符串:[]
。
第二次更改是你的递归案例。如果n为零,则执行命中第一次交替,所以我们只需要担心这两种情况:n大于零,在这种情况下我们返回一个字符并用n-1递归,或者n小于零在哪种情况下,我们抓住边缘情况并回馈一些明智的东西。从字符串中取出少于零的元素并不是一件明智的事情,所以你可以在这里选择你的回答 - error
可能是合适的。
第三个轮换是后备,是另一个基本案例。如果n
仍然不为零,但我们已经用完字符串中的项目,请停止递归并返回[]
。如果没有这种情况,代码会在cutString 100 "Hello"
(n > length str
)