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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top