string - কিভাবে Haskell একটি স্ট্রিং বিভক্ত?



(8)

Haskell একটি স্ট্রিং বিভক্ত করার একটি মান উপায় আছে?

lines এবং words একটি স্থান বা নতুন লাইনের উপর বিভাজন থেকে দুর্দান্ত কাজ করে, কিন্তু অবশ্যই কমাতে বিভক্ত করার জন্য একটি আদর্শ উপায় আছে?

আমি Hoogle এ এটি খুঁজে পাচ্ছি না।

নির্দিষ্ট হতে, আমি যেখানে split "," "my,comma,separated,list" ফেরত ["my","comma","separated","list"] যেখানে কিছু খুঁজছেন।


Ghci উদাহরণ:

>  import qualified Text.Regex as R
>  R.splitRegex (R.mkRegex "x") "2x3x777"
>  ["2","3","777"]

আপনি যদি 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"

আমি স্টিভের উত্তরটিতে কোন মন্তব্য যোগ করতে জানি না, তবে আমি সুপারিশ করতে চাই
জিএইচসি লাইব্রেরি ডকুমেন্টেশন ,
এবং বিশেষ করে সেখানে
Data.List মধ্যে Sublist ফাংশন

যা কেবল প্লেইন হ্যাসেল প্রতিবেদনটি পড়ার চেয়ে উল্লেখযোগ্য হিসাবে অনেক ভাল।

সাধারণত, খাওয়ার জন্য একটি নতুন sublist যখন কখন একটি নিয়ম সঙ্গে একটি ভাঁজ, এটি খুব সমাধান করা উচিত।


আর একবার চেষ্টা কর:

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

শুধুমাত্র একটি গৃহস্থালি জন্য কাজ করে, কিন্তু সহজে প্রসারিত করা উচিত।


এই split বলা জন্য একটি প্যাকেজ আছে।

cabal install split

এটি ভালো ব্যবহার করুন:

ghci> import Data.List.Split
ghci> splitOn "," "my,comma,separated,list"
["my","comma","separated","list"]

এটা মিলিয়ে delimiters বা বিভিন্ন delimiters হচ্ছে বিভক্ত করার জন্য অনেক অন্যান্য ফাংশন সঙ্গে আসে।


একটি স্থান জন্য একটি চরিত্র একটি সরাসরি প্রতিস্থাপন আমদানি ছাড়া, 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 ";,.:[email protected]!$#?" then ' ' else c|c <-"my,comma;separated!list"]

মনে রাখবেন যে আপনি প্রলড ফাংশন সংজ্ঞা সন্ধান করতে পারেন!

http://www.haskell.org/onlinereport/standard-prelude.html

সেখানে খুঁজছেন, words সংজ্ঞা হয়,

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"

split ব্যবহার করে যা Data.List.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]




haskell