سؤال

ودعونا نقول أريد أن حالة خاصة لوظيفة يطابق السلاسل التي تبدأ مع '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 إرجاع ربما نوع.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top