نمط مطابقة البادئات سلسلة في هاسكل
-
05-07-2019 - |
سؤال
ودعونا نقول أريد أن حالة خاصة لوظيفة يطابق السلاسل التي تبدأ مع 'Z' الحرف. أنا يمكن بسهولة القيام بذلك باستخدام نمط مطابقة عن طريق القيام شيء كما يلي:
myfunc ('Z' : restOfString) = -- do something special
myfunc s = -- do the default case here
ولكن ماذا لو أريد لمطابقة السلاسل مع بادئة أطول؟ أقول تريد أن يكون لها حالة خاصة بالنسبة للسلاسل التي تبدأ بكلمة "محمصة". ما هي أفضل طريقة لكتابة نمط لتتناسب مع مثل هذه السلسلة؟
المحلول
myfunc ('t':'o':'a':'s':'t':'e':'r' : restOfString) = ...
وباستخدام النمط العادي تعمل المباراة، ولكن يحصل مزعج كسلسلة بادئة يحصل لفترة أطول.
{-# LANGUAGE PatternGuards #-}
import Data.List
myFunc string | Just restOfString <- stripPrefix "toaster" string =
-- do something special
myFunc string = -- do the default case here
وباستخدام وظيفة مكتبة بدلا من مباراة النمط أسهل قليلا على القراءة والكتابة.
{-# LANGUAGE ViewPatterns #-}
import Data.List
myFunc (stripPrefix "toaster" -> Just restOfString) = -- do something special
myFunc string = -- do the default case here
وA GHC تمديد 6.10 تركيب يجعل هذا الاستخدام أكثر طبيعية.
وبطبيعة الحال، فإن الأخيران هما يعادل تماما، ونحن يمكن أن تجعل القيام به (بقذارة) دون أي سكر على الإطلاق.
import Data.List
myFunc string =
if restIsJust
then -- do something special
else -- do the default case here
where
(restIsJust, restOfString) =
case stripPrefix "toaster" string of
Just something -> (True, something)
Nothing -> (False, undefined)
وتهدف هذه الملحقات الجملة لجعل الحياة أسهل بالنسبة لنا، على الرغم من.
نصائح أخرى
import Data.List
myFunc str | "toaster" `isPrefixOf` str = something restOfString
| otherwise = somethingElse
where Just restOfString = stripPrefix "toaster" str
والمكتبة سبليت، http://hackage.haskell.org/packages/archive/split/0.1.1/doc/html/Data-List-Split.html ديه العديد من المهام لسلاسل تقسيم مع سلاسل، بما في ذلك مطابقة البادئة. قد تجد شيئا مفيدا هناك.
myfunc ('t' : 'o' : 'a' : 's' : 't' : 'e' : 'r' : restOfString)
وبقدر ما أنا على علم، هناك جملة لا أكثر إيجازا من ذلك.
ويمكنك بالطبع أيضا التحقق فقط ما إذا كانت السلسلة تبدأ مع محمصة في-بند حارس أو if
داخل الجسم وظيفة.
myFunc str =
case stripPrefix "toaster" str of
Just restOfString -> something restOfString
Nothing -> somethingElse
وهذا هو السبب في stripPrefix إرجاع ربما نوع.