有没有一种方法可以通过Haskell中的索引提取字符串?

时间:2019-07-03 15:09:07

标签: haskell

我正在尝试实现等效于Python的Haskell:

> "abcdef"[1:3]
'bcd'

实际上,我将首次尝试使用Haskell语言。我不知道如何处理字符串(或文本?)

substr ::文本->整数->整数->文本 ???? 我尝试使用'take'和'drop',但是我不知道确切的顺序和功能组合。

substr "abcdef" 1 3
“bcd”

1 个答案:

答案 0 :(得分:8)

Haskell的“内置”字符串类型称为String,实际上只是Char的列表。实际上,如果您尝试在GHCi提示符下输入Char的列表,它将以其String语法将其打印回给您:

> ['a','b','c']
"abc"

对于“真实”代码,String通常是一个糟糕的选择,因为它具有您希望从字符链接列表中获得的所有性能。但是,当您学习Haskell时,足以进行实验了。稍后您可以了解诸如Text之类的替代方法。

因为String是一个char列表,​​所以takedrop像在列表上一样工作:

> take 3 [1,2,3,4,5]
[1,2,3]
> take 3 "abcde"
"abc"

它们作用于字符串的开头,因此,如果要使用常规的子字符串功能,则需要先drop不需要的字符串的开头部分,然后take要做的子字符串。例如,要将"bc""abcde"中删除,您要删除"a"

> drop 1 "abcde"
"bcde"

然后取"bc"

> take 2 (drop 1 "abcde")
"bc"

其余的只是数学-通常,第一个数字“ 2”应该是所需子字符串的长度。通常,第二个数字“ 1”应该是起始位置(偏移量为零)。

因此,请尝试填写“ ???”下面带有涉及mn的表达式,如果您仍然遇到问题,请发表修改或后续问题:

substr :: Int -> Int -> String -> String
substr m n str = take ??? (drop ??? str)