Haskell:
การต่อสตริง

วิธีการ:

Haskell ทำให้การต่อเชือกข้อความเป็นเรื่องง่ายด้วยตัวดำเนินการ (++):

main :: IO ()
main = do
  let hello = "Hello"
  let world = "World!"
  
  -- ใช้ตัวดำเนินการ (++)
  putStrLn $ hello ++ " " ++ world
  
  -- ตัวอย่างผลลัพธ์: "Hello World!"

แต่ทำไมต้องหยุดที่นี่? คุณยังมี concat และ intercalate จาก Data.List สําหรับเมื่อมีรายการเข้ามาเกี่ยวข้อง:

import Data.List (intercalate, concat)

main :: IO ()
main = do
  let wordsList = ["Haskell", "is", "cool"]
  
  -- การต่อรายการข้อความ
  putStrLn $ concat wordsList
  -- ตัวอย่างผลลัพธ์: "Haskelliscool"

  -- การแทรกข้อความด้วยตัวคั่น
  putStrLn $ intercalate " " wordsList
  -- ตัวอย่างผลลัพธ์: "Haskell is cool"

ลงลึก

ย้อนกลับไปในอดีต, ตัวดำเนินการ ++ ของ Haskell ได้รับแรงบันดาลใจจากการดำเนินการที่คล้ายกันในภาษาอื่นๆ เช่น ML มันเป็นคลาสสิก แต่ไม่เสมอไปที่จะมีประสิทธิภาพสูงสุด โดยเฉพาะสําหรับข้อความขนาดใหญ่หรืองานการต่อข้อความจำนวนมาก การใช้ ++ ทุกครั้งจะสร้างรายการใหม่ ซึ่งหมายความว่าหากคุณกำลังทำงานกับข้อมูลขนาดใหญ่ คุณอาจต้องการวิธีที่มีประสิทธิภาพมากขึ้น

มีทางเลือกอื่นหรือไม่? แน่นอน ประเภท Builder จาก Data.Text.Lazy.Builder สามารถถูกปรับให้เหมาะสมกับการจัดการข้อความขนาดใหญ่ได้ดียิ่งขึ้น มันสร้างข้อความได้มีประสิทธิภาพมากขึ้นโดยการทำงานเป็นชิ้น ลดความจำเป็นในการคัดลอกเสี้ยวจนตลอดเวลา

ตัวอย่างเช่น การทำงานกับ Builder:

import Data.Text.Lazy.Builder (Builder, fromString, toLazyText)
import Data.Text.Lazy.IO as T

main :: IO ()
main = do
  let builder1 = fromString "Haskell"
  let builder2 = fromString " "
  let builder3 = fromString "is"
  let builder4 = fromString " "
  let builder5 = fromString "neat!"

  let result = mconcat [builder1, builder2, builder3, builder4, builder5]
  -- ใช้ mconcat เพื่อผสาน Builders เข้าด้วยกัน

  T.putStrLn $ toLazyText result
  -- ตัวอย่างผลลัพธ์: "Haskell is neat!"

ทำไมต้องเลือกใช้ Builder หรือ concat? พวกเขาจัดการกับข้อมูลขนาดใหญ่โดยไม่โอ้โหต่อประสิทธิภาพ ช่วยให้คุณสามารถรวมข้อความได้โดยไม่มีปัญหาในเรื่องประสิทธิภาพ

ดูเพิ่มเติม

  • Haskell Wiki เกี่ยวกับ Performance/Strings เพื่อศึกษาเพิ่มเติมเกี่ยวกับการพิจารณาประสิทธิภาพ
  • เอกสารการใช้งานของ package Data.Text สำหรับการทำงานกับข้อความ Unicode ใน Haskell
  • เว็บไซต์ ภาษา Haskell เพื่อติดตามอัปเดตทุกอย่างเกี่ยวกับ Haskell