32

文字「Z」で始まる文字列に一致する関数の特別なケースを作成したいとしましょう。次のようなことを行うことで、パターン マッチングを使用して簡単に実行できます。

myfunc ('Z' : restOfString) = -- do something special
myfunc s = -- do the default case here

しかし、より長いプレフィックスを持つ文字列に一致させたい場合はどうすればよいでしょうか? 「トースター」という単語で始まる文字列の特別なケースが必要だとします。そのような文字列に一致するパターンを記述する最良の方法は何ですか?

4

5 に答える 5

41
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

GHC 6.10構文拡張により、この使用法はさらに自然になります。


もちろん、後者の2つは完全に同等であり、砂糖をまったく使用せずに(乱雑に)実行できます。

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)

ただし、これらの構文拡張は、私たちの生活を楽にすることを目的としています。

于 2009-10-21T17:24:28.843 に答える
9
import Data.List

myFunc str | "toaster" `isPrefixOf` str = something restOfString
           | otherwise = somethingElse
    where Just restOfString = stripPrefix "toaster" str
于 2009-10-21T18:06:27.417 に答える
6

Split ライブラリhttp://hackage.haskell.org/packages/archive/split/0.1.1/doc/html/Data-List-Split.htmlには、プレフィックス マッチングを含む、文字列を文字列で分割するための多くの関数があります。そこに役立つものが見つかるかもしれません。

于 2009-10-21T20:37:47.330 に答える
5
myfunc ('t' : 'o' : 'a' : 's' : 't' : 'e' : 'r' : restOfString)

私の知る限り、それ以上の簡潔な構文はありません。

もちろん、文字列がガード句のトースターで始まるのか、if関数本体の内側で始まるのかを確認することもできます。

于 2009-10-21T17:23:58.937 に答える
4
myFunc str =
  case stripPrefix "toaster" str of
     Just restOfString -> something restOfString
     Nothing -> somethingElse

これが、stripPrefix が Maybe 型を返す理由です。

于 2010-06-11T19:36:16.143 に答える