Nic*_*ick 25 haskell pattern-matching
假设我想为一个匹配以字符'Z'开头的字符串的函数创建一个特例.通过执行以下操作,我可以使用模式匹配轻松完成:
myfunc ('Z' : restOfString) = -- do something special
myfunc s = -- do the default case here
Run Code Online (Sandbox Code Playgroud)
但是如果我想匹配具有更长前缀的字符串呢?假设我想要一个以"烤面包机"开头的字符串的特殊情况.编写匹配此类字符串的模式的最佳方法是什么?
eph*_*ent 36
myfunc ('t':'o':'a':'s':'t':'e':'r' : restOfString) = ...
Run Code Online (Sandbox Code Playgroud)
使用普通模式匹配有效,但随着前缀字符串变长而变得麻烦.
{-# LANGUAGE PatternGuards #-}
import Data.List
myFunc string | Just restOfString <- stripPrefix "toaster" string =
-- do something special
myFunc string = -- do the default case here
Run Code Online (Sandbox Code Playgroud)
使用库函数而不是模式匹配更容易读写.
{-# LANGUAGE ViewPatterns #-}
import Data.List
myFunc (stripPrefix "toaster" -> Just restOfString) = -- do something special
myFunc string = -- do the default case here
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
但是,这些语法扩展旨在让我们的生活更轻松.
import Data.List
myFunc str | "toaster" `isPrefixOf` str = something restOfString
| otherwise = somethingElse
where Just restOfString = stripPrefix "toaster" str
Run Code Online (Sandbox Code Playgroud)
Split库,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)
Run Code Online (Sandbox Code Playgroud)
据我所知,没有比这更简洁的语法了。
您当然也可以只检查字符串是在保护子句中还是if在函数体内部以烤面包机开头。
| 归档时间: |
|
| 查看次数: |
20840 次 |
| 最近记录: |