نوع char در F# مقداری ۱۶ بیتی است که کوچکترین اجزای آدرسپذیر متن را نمایش میدهد و بهطور پیشفرض تغییرناپذیر است.
میتوان charها را با نقلقول تکی بهصورت لیترال تعریف کرد:
let ch = 'A'
// => val ch: char = 'A'
رشتهها دنبالهای از charها هستند.
میتوان یک char تکی را با نمایهگذاری (از صفر) از یک رشته به دست آورد:
"Exercism"[4] // => 'c'
پیمایش یک رشته در هر گام یک char برمیگرداند.
مثال بعدی برای راحتی از یک تابع مرتبهبالا و یک تابع بینام استفاده میکند. اینها بعداً در برنامهی درسی بهطور کامل پوشش داده میشوند، اما در حال حاضر اساساً روشی مختصر برای نوشتن یک حلقه روی کاراکترهای یک رشتهاند.
Seq.map (fun c -> c, int c) "F#" // => [('F', 70); ('#', 35)]
همانطور که در بالا نشان داده شد، میتوان یک char را به مقدار int آن تبدیل کرد.
این کار (حداقل بعضی وقتها) برای سایر خطهای نوشتاری هم انجام میشود:
Seq.map (fun c -> c, int c) "東京" // => [('東', 26481); ('京', 20140)]
هنگام مقایسهی کاراکترها از Int16 زیربنایی استفاده میشود:
'A' < 'D' // => true
همچنین میتوان یک int را به char تبدیل کرد:
char 77 // => 'M'
کتابخانهی System.Char شامل مجموعهی کاملی از متدهایی است که از یک زبان .NET انتظار میرود، مانند تبدیل به حروف بزرگ/کوچک:
'a' |> System.Char.ToUpper // => 'A'
'Q' |> System.Char.ToLower // => 'q'
در این تمرین، مجموعهای جزئی از توابع کمکی را پیادهسازی میکنید تا به یک برنامهنویس در پاکسازی اسم شناسهها کمک کنید.
در ۶ مرحله، بهتدریج توابع transform را برای تبدیل تککاراکترها و clean را برای تبدیل رشتهها میسازید.
یک شناسهی معتبر از صفر یا چند حرف، زیرخط، خط تیره، علامت سؤال و ایموجی تشکیل میشود.
اگر رشتهی خالی به تابع clean داده شود، باید رشتهی خالی برگردانده شود.
تابع transform را پیادهسازی کنید تا هر خط تیره را با زیرخط جایگزین کند.
transform '-' // => "_"
همهی کاراکترهای فضای خالی را حذف کنید. این شامل فضای خالی ابتدا و انتهای رشته هم میشود.
transform ' ' // => ""
تابع transform را تغییر دهید تا camelCase را به kebab-case تبدیل کند.
transform 'D' // => "-d"
تابع transform را تغییر دهید تا هر کاراکتری را که عددی است حذف کند.
transform '7' // => ""
تابع transform را تغییر دهید تا هر حرف یونانی در بازهی 'α' تا 'ω' را با علامت سؤال جایگزین کند.
transform 'β' // => "?"
تابع clean را پیادهسازی کنید تا این عملیات را روی کل رشته اعمال کند.
کاراکترهایی که خارج از این قواعد قرار میگیرند باید بدون تغییر عبور کنند.
clean " a2b Cd-ω😀 " // => "ab-cd_?😀"
این موضوع بعداً در برنامهی درسی با جزئیات بررسی میشود.
اما فعلاً ممکن است دانستن این نکته مفید باشد که یک تابع مرتبه بالا به اسم String.collect وجود دارد که یک مجموعه از charها را، با استفاده از تابعی که خودتان میدهید، به یک رشته تبدیل میکند.
let transform ch = $"{ch}_"
String.collect transform "abc" // => "a_b_c_"