我正试图将Haskell等同于Python:
>>>"This is a test"[5:9]
'is a'
我正在使用Data.Text
模块,如果这有任何区别的话。
答案 0 :(得分:5)
使用take
函数简单:
substring :: Int -> Int -> Text -> Text
substring start end text = take (end - start) (drop start text)
答案 1 :(得分:2)
此外,您可以根据Data.Text.take
和takeEnd
来定义函数,这两个函数来自Data.Text
库:
slice :: Int -> Int -> Text -> Text
slice a b text = takeEnd a (Data.Text.take b text)
答案 2 :(得分:1)
通常使用drop :: Int -> Text -> Text
和take :: 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)
使用点运算符和节可以很好地定义 take
和 drop
:
slice off n = (take n).(drop off)
然后您可以使用 slice 2 3 "hello!"
获得 "llo"