Haskell에서 문자열을 분리하는 표준 방법이 있습니까?
lines
및 words
업무 공백이나 줄 바꿈에 분할에서 큰하지만 반드시 쉼표에 분할하는 표준 방법은 무엇입니까?
Hoogle에서 찾을 수 없습니다.
구체적으로, split "," "my,comma,separated,list"
returns 가있는 곳을 찾고 ["my","comma","separated","list"]
있습니다.
답변
이를 위해 split 이라는 패키지가 있습니다 .
cabal install split
다음과 같이 사용하십시오.
ghci> import Data.List.Split
ghci> splitOn "," "my,comma,separated,list"
["my","comma","separated","list"]
일치하는 구분 기호를 분할하거나 여러 구분 기호를 갖는 많은 다른 기능이 제공됩니다.
답변
Prelude 기능의 정의를 찾을 수 있습니다!
http://www.haskell.org/onlinereport/standard-prelude.html
거기를 보면 words
is 의 정의 는
words :: String -> [String]
words s = case dropWhile Char.isSpace s of
"" -> []
s' -> w : words s''
where (w, s'') = break Char.isSpace s'
술어를 취하는 함수로 변경하십시오.
wordsWhen :: (Char -> Bool) -> String -> [String]
wordsWhen p s = case dropWhile p s of
"" -> []
s' -> w : wordsWhen p s''
where (w, s'') = break p s'
그런 다음 원하는 술어를 사용하여 호출하십시오!
main = print $ wordsWhen (==',') "break,this,string,at,commas"
답변
Data.Text를 사용하면 splitOn이 있습니다.
http://hackage.haskell.org/packages/archive/text/0.11.2.0/doc/html/Data-Text.html#v:splitOn
이것은 Haskell 플랫폼에 내장되어 있습니다.
예를 들어 :
import qualified Data.Text as T
main = print $ T.splitOn (T.pack " ") (T.pack "this is a test")
또는:
{-# LANGUAGE OverloadedStrings #-}
import qualified Data.Text as T
main = print $ T.splitOn " " "this is a test"
답변
Text.Regex (Haskell 플랫폼의 일부) 모듈에는 다음과 같은 기능이 있습니다.
splitRegex :: Regex -> String -> [String]
정규식을 기반으로 문자열을 분할합니다. API는 Hackage 에서 찾을 수 있습니다 .
답변
를 사용 Data.List.Split
하는 다음을 사용하십시오 split
.
[me@localhost]$ ghci
Prelude> import Data.List.Split
Prelude Data.List.Split> let l = splitOn "," "1,2,3,4"
Prelude Data.List.Split> :t l
l :: [[Char]]
Prelude Data.List.Split> l
["1","2","3","4"]
Prelude Data.List.Split> let { convert :: [String] -> [Integer]; convert = map read }
Prelude Data.List.Split> let l2 = convert l
Prelude Data.List.Split> :t l2
l2 :: [Integer]
Prelude Data.List.Split> l2
[1,2,3,4]
답변
이거 한번 해봐:
import Data.List (unfoldr)
separateBy :: Eq a => a -> [a] -> [[a]]
separateBy chr = unfoldr sep where
sep [] = Nothing
sep l = Just . fmap (drop 1) . break (== chr) $ l
단일 문자에서만 작동하지만 쉽게 확장 가능해야합니다.
답변
공백을 하나의 문자로 직접 대체하지 않고 대상 구분 기호 words
는 공백입니다. 다음과 같은 것 :
words [if c == ',' then ' ' else c|c <- "my,comma,separated,list"]
또는
words let f ',' = ' '; f c = c in map f "my,comma,separated,list"
이를 매개 변수가있는 함수로 만들 수 있습니다. 다음 과 같이 일치하는 많은 문자와 일치 하는 매개 변수를 제거 할 수 있습니다 .
[if elem c ";,.:-+@!$#?" then ' ' else c|c <-"my,comma;separated!list"]