在Haskell中,如何在两个索引之间获取Text的子字符串?

时间:2018-01-21 16:50:26

标签: string haskell slice

我正试图将Haskell等同于Python:

>>>"This is a test"[5:9]
'is a'

我正在使用Data.Text模块,如果这有任何区别的话。

5 个答案:

答案 0 :(得分:5)

使用take函数简单:

substring :: Int -> Int -> Text -> Text
substring start end text = take (end - start) (drop start text)

答案 1 :(得分:2)

此外,您可以根据Data.Text.taketakeEnd来定义函数,这两个函数来自Data.Text库:

slice :: Int -> Int -> Text -> Text
slice a b text = takeEnd a (Data.Text.take b text)

答案 2 :(得分:1)

通常使用drop :: Int -> Text -> Texttake :: Int -> Text -> Text来获取子文本的切片。我们可以将两者结合起来制作某种substring

import Data.Text as Tx(Text, drop, take)

substring :: Int -> Int -> Tx.Text -> Tx.Text
substring start length = Tx.take length . Tx.drop start

或者如果我们想要使用结束索引(独占),我们可以创建一个slice函数:

import Data.Text as Tx(drop, take)

slice :: Int -> Int -> Tx.Text -> Tx.Text
slice start end = Tx.take (end-start) . Tx.drop start

我们可以像以下一样使用它:

Prelude Tx> slice 5 9 "This is a test"
"is a"

这不是完全等同于Python的切片表示法,因为例如Python使用负索引作为从最后一个元素计数的方式(即-1是最后一个我们可以使用'foobar'[-5:-2]来获得一个切片,其中索引意味着" 最后一个切片,但最后四个切换到但是一个元素"。

答案 3 :(得分:0)

import Data.List

substring :: Int -> Int -> String -> String

substring i j s = take (j-i) ( drop i s )

答案 4 :(得分:0)

使用点运算符和节可以很好地定义 takedrop

slice off n = (take n).(drop off)

然后您可以使用 slice 2 3 "hello!" 获得 "llo"