বিভাজকের সাথে তাল মিলিয়ে দেওয়ার জন্য কি কোনও হাস্কেলের কাজ রয়েছে?


131

একটি বিভাজকের সাথে তালিকার উপাদানগুলিকে একত্রিত করার কোনও কার্যকারিতা আছে কি? উদাহরণ স্বরূপ:

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

কোন জবাবের জন্য ধন্যবাদ!


13
আমি জানি lmgtfy উত্তরগুলি খারাপ, তবে এটি লক্ষ্য করার মতো বিষয় যে hoogle এ "স্ট্রিং -> [স্ট্রিং] -> স্ট্রিং" অনুসন্ধানের জন্য আপনি যা চান ঠিক তেমন পান। haskell.org/hoogle
sigfpe

3
আপনার যে জায়গাগুলি রয়েছে unwords
সেগুলিতে

1
@ সিগফ্পে সাইড মন্তব্য: আপনি [String] -> String -> Stringযদি অন্যভাবে কোনও উত্তর না দিয়ে থাকেন তবে আপনাকে সন্ধান করতে হবে , তাই না?
গনজালেজ

1
@ লেগনজালেজ সন্ধানটি অনুমতি ছাড়াই শেষ। উদাহরণস্বরূপ তার প্রথম ফলাফল হিসাবে [a] -> (a -> b) -> [b]রিটার্ন অনুসন্ধান map
গ্যালাইস

উত্তর:


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একইভাবে কাজ করে, কেবলমাত্র নতুন পংক্তির অক্ষর ব্যবহার করে স্ট্রিংগুলি বিস্তৃত হয় এবং শেষদিকে একটি নতুনলাইন চরিত্রও যুক্ত হয়। (এটি পাঠ্য ফাইলগুলিকে সিরিয়ালাইজ করার জন্য উপকারী করে তোলে, যা অবশ্যই চলমান নিউলাইনের সাথে প্রতি পসিক্স স্ট্যান্ডার্ড শেষ হওয়া উচিত)


এর মধ্যে যে কোনওটি খালি স্ট্রিংগুলির সাথে মোকাবিলা করতে পারে?
সিএমসিডিগ্রাগনকাই

3
@ সিএমসিডিগ্রাগনকাই নিশ্চিত আপনি ঠিক কী উল্লেখ করছেন তা নিশ্চিত নয়, তবে হ্যাঁ, এই ফাংশনগুলি সমস্ত বিভাজক এবং উপাদান উভয় হিসাবে স্বেচ্ছাচারী স্ট্রিংকে অনুমতি দেয়। উদাহরণস্বরূপ, intercalate "," ["some", "", "string"] = "some,,string"এবংintercalate "" ["foo", "bar"] = "foobar"
নিক্লাস বি।

3
unlinesপ্রতিটি লাইনে একটি নতুন লাইন যুক্ত করে, unlines ["A", "B"] = "A\nB\n"এটি হ'ল আন্তঃক্যাল্যাটের মতো নয়।
ক্যাথি ভ্যান স্টোন

@ ক্যাথিভ্যানস্টোন আকর্ষণীয়, আমি অনুমান করি যে আমি কখনও চেষ্টা করি নি এবং কেবল ধরে নিয়েছি এটি একইভাবে কাজ করে unwords
নিক্লাস বি।

1
এটি খুব ভাল যে স্ট্যান্ডার্ড লাইব্রেরিতে কিছু সাধারণ স্ট্রিং এবং তালিকা ম্যানিপুলেশন ফাংশন রয়েছে এবং আপনি এখানে একটি উদাহরণ পোস্ট করে খুব ভাল, কারণ হাস্কেলের এই জাতীয় প্রতিদিনের প্রোগ্রামিংয়ের জন্য কোনও ডকুমেন্টেশন খুঁজে পাওয়া বেশ কঠিন।
অ্যান্ড্রু কোস্টার 16

4

ফোল্ডার ব্যবহার করে ওয়ান-লাইনার লেখা কঠিন নয়

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

3
এটিতে একটি বিবরণ যুক্ত করা উপকারী হবে; কেউ এটিকে নিম্ন মানের হিসাবে পতাকাঙ্কিত করেছে।
আর্য ম্যাকার্থি


3

ইন্টারপ্রেসি এবং ইন্টারক্লেট বাস্তবায়নের কয়েকটি অন্যান্য ধারণা, যদি কেউ আগ্রহী হন:

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

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

xs >>= fসমতূল্য concat (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
কেন নিজেকে স্ট্রিং সীমাবদ্ধ? এছাড়াও, ফাংশন অ্যাপ্লিকেশনটির চারপাশে আপনার প্যারেনগুলি অনর্থক।
মেল্পোমেন

এটা ঠিক যে, intersperseপ্রয়োজন হবে না Strings, কিন্তু intercalateঅন্তত হতে হবে Show, এবং যদি আপনি করেনি ব্যবহার Show, আপনি ব্যবহার তাদের সঙ্গে মোকাবেলা করার কিছু উপায় প্রয়োজন চাই Stringগুলি যাহাই হউক না কেন। আমি এখনও $
অভ্যস্ত হয়ে উঠছি

intercalate :: [a] -> [[a]] -> [a]- কেন Show? সিনট্যাক্সের ক্ষেত্রে, হাস্কেলের কোনও উপসর্গ অপারেটর নেই (ব্যতীত -এটি একটি জঘন্য কাজ), এবং ফাংশন অ্যাপ্লিকেশনটি কোনও ইনফিক্স অপারেটরের তুলনায় আরও কঠোরভাবে আবদ্ধ হয়: x:s:intersperse s xsভাল (তবে আপনি স্পেসগুলি রাখলে এটি আরও ভাল পড়বে: x : s : intersperse s xs(আমি ডন না লোকেরা কেন আশেপাশের স্থানগুলি ছেড়ে দিতে পছন্দ করে তা সত্যিই বুঝতে পারি না :))।
মেলপোমেন

ঠিক। আমি ভুলে যাচ্ছি যে স্ট্রিংগুলির সাথে কাজ করা কেবলমাত্র তালিকাগুলির সাথে কাজ করে। Showকারণ আমি ধরে নিছিলাম যে আপনি ফলাফলটি একটি হতে চান String। "ইনফিক্স এবং প্রিফিক্স ফাংশন / অপারেটর" দ্বারা আমি "প্রিফিক্স ফাংশন এবং ইনফিক্স অপারেটর" বোঝাতে চাইছিলাম তবে এটি অস্পষ্ট ছিল। আনরি -হ'ল মৃত্যু। হিসাবে :s এবং অন্যান্য পোতা অপারেটর, কিনা আমি ব্যবধান ব্যবহার অত্যন্ত প্রসঙ্গ উপর নির্ভর করে, কিন্তু আমি সবসময় স্থানীয়ভাবে সামঞ্জস্যপূর্ণ নই। উদাহরণস্বরূপ, (:)কোনও প্যাটার্ন ম্যাচে কখনও স্পেস থাকে না, তবে অন্য কোথাও এটি বন্ধনীযুক্ত কিনা এবং আমার মেজাজের উপর নির্ভর করে।
জোয়ে হিউল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.