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 делает это использование еще более естественным.
Конечно, последние два полностью эквивалентны, и мы можем обойтись (беспорядочно) вообще без сахара.
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)
Эти расширения синтаксиса предназначены для того, чтобы облегчить нам жизнь.