Heeft Haskell List Slices (d.w.z. Python)?

Heeft Haskell vergelijkbare syntactische suikers als Python List Slices?

Bijvoorbeeld in Python:

x = ['a','b','c','d']
x[1:3] 

geeft de karakters van index 1 tot index 2 inbegrepen (of tot index 3 uitgesloten):

['b','c']

Ik weet dat Haskell de functie (!!)heeft voor specifieke indices, maar is er een equivalente “slicing”- of lijstbereikfunctie?


Antwoord 1, autoriteit 100%

Er is geen ingebouwde functie om een ​​lijst te segmenteren, maar je kunt er gemakkelijk zelf een schrijven met dropen take:

slice :: Int -> Int -> [a] -> [a]
slice from to xs = take (to - from + 1) (drop from xs)

Opgemerkt moet worden dat aangezien Haskell-lijsten enkelvoudig gekoppelde lijsten zijn (terwijl Python-lijsten arrays zijn), het maken van dergelijke sublijsten O(to)zal zijn, niet O(to - from)zoals in python (ervan uitgaande dat de hele lijst natuurlijk wordt geëvalueerd – anders wordt de luiheid van Haskell van kracht).


Antwoord 2, autoriteit 59%

Als je Python “lijsten” probeert te matchen (wat geen lijst is, zoals anderen opmerken), dan wil je misschien de Haskell vectorpakket dat wel een ingebouwde slice. Ook kan Vectorparallel worden geëvalueerd, wat volgens mij is echt gaaf.


Antwoord 3, autoriteit 31%

Geen syntactische suiker. In gevallen waar het nodig is, kun je gewoon takeen drop.

take 2 $ drop 1 $ "abcd" -- gives "bc"

Antwoord 4, autoriteit 16%

Ik denk niet dat er een is opgenomen, maar je zou er vrij eenvoudig een kunnen schrijven:

slice start end = take (end - start + 1) . drop start

Natuurlijk, met als voorwaarde dat starten endbinnen de grenzen zijn, en end >= start.

Other episodes