从Haskell中的String中剪切前x个字符

时间:2018-04-25 16:12:28

标签: string haskell

我试图创建一个将列表中的部分字符串连接到另一个字符串的函数。我已经知道如何选择我想要的字符串,但现在我需要它们的第一部分(并且它并不总是相同的值)。

所以我想剪掉一个字符串的第一部分

-- 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"

有没有简单的方法可以做到这一点?

感谢您提供任何帮助或建议。

2 个答案:

答案 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

的任何地方崩溃