มีฟังก์ชั่น Haskell เพื่อเชื่อมโยงรายการกับตัวคั่นหรือไม่


131

มีฟังก์ชั่นเพื่อเชื่อมองค์ประกอบของรายการที่มีตัวคั่นหรือไม่? ตัวอย่างเช่น:

> foobar " " ["is","there","such","a","function","?"]
["is there such a function ?"]

ขอบคุณสำหรับการตอบกลับใด ๆ !


13
ฉันรู้ว่าคำตอบ lmgtfy นั้นไม่ดี แต่มันก็คุ้มที่จะทราบว่าการค้นหา "String -> [String] -> String" บน hoogle นั้นเป็นสิ่งที่คุณต้องการ haskell.org/hoogle
sigfpe

3
สำหรับการเข้าร่วมกับช่องว่างคุณยังมีunwords
epsilonhalbe

1
@sigfpe ความคิดเห็นด้าน: คุณจะต้องมองหา[String] -> String -> Stringในกรณีที่วิธีอื่นไม่มีคำตอบใช่ไหม?
Lay González

1
@ LayGonzálezการค้นหาขึ้นอยู่กับการเรียงสับเปลี่ยน ตัวอย่างเช่นการค้นหา[a] -> (a -> b) -> [b]ผลตอบแทนmapเป็นผลลัพธ์แรก
gallais

คำตอบ:


228

ใช่นั่นคือ :

Prelude> import Data.List
Prelude Data.List> intercalate " " ["is","there","such","a","function","?"]
"is there such a function ?"

intersperse เป็นทั่วไปมากกว่า:

Prelude> import Data.List
Prelude Data.List> concat (intersperse " " ["is","there","such","a","function","?"])
"is there such a function ?"

นอกจากนี้สำหรับกรณีเฉพาะที่คุณต้องการเข้าร่วมกับอักขระช่องว่างมีunwords:

Prelude> unwords ["is","there","such","a","function","?"]
"is there such a function ?"

unlinesทำงานในทำนองเดียวกันเฉพาะสายอักขระที่ถูก imploded โดยใช้อักขระขึ้นบรรทัดใหม่และอักขระขึ้นบรรทัดใหม่จะถูกเพิ่มไปยังจุดสิ้นสุด (สิ่งนี้ทำให้มีประโยชน์สำหรับซีเรียลไฟล์ข้อความซึ่งจะต้องต่อท้ายมาตรฐาน POSIX ที่มีบรรทัดใหม่ต่อท้าย)


ข้อใดข้อหนึ่งสามารถจัดการกับสตริงว่างที่เป็นไปได้หรือไม่?
CMCDragonkai

3
@CMCDragonkai ไม่แน่ใจว่าสิ่งที่คุณหมายถึง แต่ใช่ฟังก์ชั่นเหล่านี้ทั้งหมดอนุญาตให้ใช้สตริงโดยพลการเป็นทั้งตัวแยกและองค์ประกอบ ตัวอย่างเช่นintercalate "," ["some", "", "string"] = "some,,string"และintercalate "" ["foo", "bar"] = "foobar"
Niklas B.

3
unlinesเพิ่มขึ้นบรรทัดใหม่ให้กับแต่ละบรรทัดนั่นคือunlines ["A", "B"] = "A\nB\n"ดังนั้นจึงไม่เหมือนกับ intercalate
Kathy Van Stone

@KathyVanStone ที่น่าสนใจผมคิดว่าผมไม่เคยพยายามและสันนิษฐานว่าเพียง แต่มันทำงาน analogously unwordsไป
Niklas B.

1
เป็นเรื่องดีที่มีฟังก์ชั่นการจัดการสตริงและรายการปกติในไลบรารีมาตรฐานและเป็นเรื่องดีที่คุณโพสต์ตัวอย่างที่นี่เพราะมันค่อนข้างยากที่จะหาเอกสารใด ๆ สำหรับการเขียนโปรแกรมประเภทนี้ทุกวันใน Haskell
Andrew Koster

4

การเขียนซับเดี่ยวโดยใช้ foldr นั้นไม่ยาก

join sep xs = foldr (\a b-> a ++ if b=="" then b else sep ++ b) "" xs
join " " ["is","there","such","a","function","?"]

3
มันจะเป็นประโยชน์ในการเพิ่มคำอธิบายนี้; บางคนตั้งค่าสถานะว่าเป็นคุณภาพต่ำ
Arya McCarthy


3

แนวคิดอื่น ๆ ของการใช้งานของ intersperse และ intercalate ถ้ามีคนสนใจ:

myIntersperse :: a -> [a] -> [a]
myIntersperse _ [] = []
myIntersperse e xs = init $ xs >>= (:[e])

myIntercalate :: [a] -> [[a]] -> [a]
myIntercalate e xs = concat $ myIntersperse e xs

xs >>= fconcat (map f xs)เทียบเท่ากับ


2

หากคุณต้องการเขียนเวอร์ชันของคุณเองintercalateและintersperse:

intercalate :: [a] -> [[a]] -> [a]
intercalate s [] = []
intercalate s [x] = x
intercalate s (x:xs) = x ++ s ++ (intercalate s xs)

intersperse :: a -> [a] -> [a]
intersperse s [] = []
intersperse s [x] = [x]
intersperse s (x:xs) = x : s : (intersperse s xs)

1
เหตุใดจึง จำกัด ตัวเองกับสายอักขระ? นอกจากนี้ parens ของคุณรอบ ๆ แอปพลิเคชันฟังก์ชั่นซ้ำซ้อน
melpomene

ทรูintersperseไม่จำเป็นต้องเป็นStringsแต่intercalateจะต้องเป็นอย่างน้อยShowและถ้าคุณไม่ได้ใช้งานShowคุณจะต้องมีวิธีจัดการกับพวกเขาโดยใช้บางส่วนStrings อยู่แล้ว ฉันยังคงรับใช้วิธี Haskell เกี่ยวข้องกับการผสมมัดและคำนำหน้าฟังก์ชั่น / ผู้ประกอบการและฉันชอบคร่อมเมื่อผสมในกรณีที่ฉันจบลงด้วยการที่ต้องการใช้$
Zoey Hewll

intercalate :: [a] -> [[a]] -> [a]- ทำไมShow? ในฐานะที่เป็นไวยากรณ์ Haskell ไม่ได้มีผู้ประกอบการคำนำหน้าใด ๆ (ยกเว้น-ซึ่งเป็นสิ่งที่น่ารังเกียจ) และผูกประยุกต์ใช้ฟังก์ชั่นที่เข้มงวดมากขึ้นกว่าผู้ประกอบการมัดใด ๆx:s:intersperse s xsเป็นเรื่องปกติ ( แต่มันอ่านมากดีกว่าถ้าคุณใส่ช่องว่างใน: x : s : intersperse s xs(ฉันไม่ ไม่เข้าใจจริงๆว่าทำไมคนชอบออกจากพื้นที่รอบ ๆ:))
melpomene

ขวา. ฉันลืมไปว่าการทำงานกับสตริงนั้นเป็นเพียงการทำงานกับรายการ ถูกเพราะผมสมมติว่าคุณต้องการผลที่ได้จะเป็นShow Stringโดย "infix และคำนำหน้าฟังก์ชั่น / ตัวดำเนินการ" ฉันหมายถึง "คำนำหน้าฟังก์ชั่นและตัวดำเนินการมัด" แต่นั่นก็ไม่ชัดเจน เอก-คือความตาย สำหรับตัวดำเนินการ:s และ infix อื่น ๆ ไม่ว่าฉันจะใช้ช่องว่างนั้นขึ้นอยู่กับบริบทหรือไม่ เช่น(:)ในการจับคู่รูปแบบไม่เคยมีช่องว่าง แต่ที่อื่นขึ้นอยู่กับว่ามีฉากยึดและอารมณ์ของฉันหรือไม่
Zoey Hewll
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.