В Haskell, как вы урезаете пробел от начала и конца строки? - PullRequest
47 голосов
/ 07 июня 2011

Как обрезать пробелы в начале и в конце строки?

trim "  abc " 

=>

"abc"

Edit:

Хорошо, позвольте мне быть немного яснее. Я не понял, что строковые литералы трактуются так по-разному, как строковые.

Я хотел бы сделать это:

import qualified Data.Text as T
let s :: String = "  abc  "
in T.strip s

Возможно ли это на Хаскеле? Я использую -XOverloadedStrings, но это работает только для литералов.

Ответы [ 12 ]

0 голосов
/ 13 декабря 2013

В соответствии с тем, что предложили другие люди, вы можете избежать необходимости переворачивать вашу строку, используя:

import Data.Char (isSpace)

dropFromTailWhile _ [] = []
dropFromTailWhile p item
  | p (last items) = dropFromTailWhile p $ init items
  | otherwise      = items

trim :: String -> String
trim = dropFromTailWhile isSpace . dropWhile isSpace
0 голосов
/ 21 сентября 2012

Я ничего не знаю о времени выполнения или эффективности, но как насчет этого:

-- entirely input is to be trimmed
trim :: String -> String
trim = Prelude.filter (not . isSpace')

-- just the left and the right side of the input is to be trimmed
lrtrim :: String -> String
lrtrim = \xs -> rtrim $ ltrim xs
  where
    ltrim = dropWhile (isSpace')
    rtrim xs
      | Prelude.null xs = []
      | otherwise = if isSpace' $ last xs
                    then rtrim $ init xs
                    else xs 

-- returns True if input equals ' '
isSpace' :: Char -> Bool
isSpace' = \c -> (c == ' ')

Решение без использования какого-либо другого модуля или библиотеки, кроме Prelude.

Некоторые тесты:

>lrtrim ""
>""

>lrtrim "       "
>""

>lrtrim "haskell       "
>"haskell"

>lrtrim "      haskell       "
>"haskell"

>lrtrim "     h  a  s k e   ll       "
>"h  a  s k e   ll"

Это может быть время выполнения O (n).

Но на самом деле я этого не знаю, потому что не знаю времени выполнения функций last и init.;)

...