Musteranpassungs Zeichenfolge Präfixe in Haskell
-
05-07-2019 - |
Frage
Lassen Sie uns sagen, dass ich einen Sonderfall für eine Funktion machen wollen, die Strings übereinstimmt, die mit dem Buchstaben ‚Z‘ beginnen. Ich konnte es einfach tun Mustervergleich unter Verwendung von so etwas wie die folgenden Aktionen ausführen:
myfunc ('Z' : restOfString) = -- do something special
myfunc s = -- do the default case here
Aber was, wenn ich will mit einem längeren Präfix Strings übereinstimmen? Sagen, dass ich einen Sonderfall für Streicher haben will, die mit dem Wort „Toaster“ beginnen. Was ist der beste Weg, um ein Muster zu schreiben, eine solche Zeichenfolge übereinstimmen?
Lösung
myfunc ('t':'o':'a':'s':'t':'e':'r' : restOfString) = ...
ein normales Muster verwendet Spiel funktioniert, aber bekommt störend empfunden werden als die Präfixzeichenfolge länger wird.
{-# LANGUAGE PatternGuards #-}
import Data.List
myFunc string | Just restOfString <- stripPrefix "toaster" string =
-- do something special
myFunc string = -- do the default case here
Mit einer Bibliotheksfunktion anstelle einer Mustererkennung ist ein bisschen leichter lesen und schreiben.
{-# LANGUAGE ViewPatterns #-}
import Data.List
myFunc (stripPrefix "toaster" -> Just restOfString) = -- do something special
myFunc string = -- do the default case here
Eine GHC 6.10 Syntax-Erweiterung macht diese Nutzung noch natürlicher.
Natürlich sind die beiden letzteren gleichen Ergebnis, und wir können ganz ohne Zucker (messily) vorlieb nehmen.
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)
Diese Syntax-Erweiterungen sollen das Leben einfacher für uns machen, though.
Andere Tipps
import Data.List
myFunc str | "toaster" `isPrefixOf` str = something restOfString
| otherwise = somethingElse
where Just restOfString = stripPrefix "toaster" str
Die Split-Bibliothek, http://hackage.haskell.org/packages/archive/split/0.1.1/doc/html/Data-List-Split.html hat viele Funktionen zum Aufspalten strings mit Strings, einschließlich Präfix Anpassung. Vielleicht haben Sie etwas Nützliches dort finden.
myfunc ('t' : 'o' : 'a' : 's' : 't' : 'e' : 'r' : restOfString)
Soweit ich weiß, gibt es nicht mehr prägnante Syntax als das.
Sie können natürlich auch nur prüfen, ob die Zeichenfolge mit Toaster beginnen in einer Schutzklausel oder eine if
im Funktionskörper.
myFunc str =
case stripPrefix "toaster" str of
Just restOfString -> something restOfString
Nothing -> somethingElse
Aus diesem Grund stripPrefix gibt einen Vielleicht Typ.