Haskell의 패턴 일치 문자열 접두사
-
05-07-2019 - |
문제
문자 'z'로 시작하는 문자열과 일치하는 함수에 대한 특별한 사례를 만들고 싶다고 가정 해 봅시다. 다음과 같은 작업을 수행하여 패턴 매칭을 사용하여 쉽게 할 수 있습니다.
myfunc ('Z' : restOfString) = -- do something special
myfunc s = -- do the default case here
그러나 줄을 더 긴 접두사와 일치시키고 싶다면 어떻게해야합니까? "토스터"라는 단어로 시작하는 문자열에 대한 특별한 사례를 원한다고 가정 해 봅시다. 그러한 문자열과 일치하는 패턴을 작성하는 가장 좋은 방법은 무엇입니까?
해결책
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)
그러나 이러한 구문 확장은 우리를 더 쉽게 만들기위한 것입니다.
다른 팁
import Data.List
myFunc str | "toaster" `isPrefixOf` str = something restOfString
| otherwise = somethingElse
where Just restOfString = stripPrefix "toaster" str
분할 라이브러리, 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)
내가 아는 한, 그보다 더 간결한 구문은 없습니다.
물론 문자열이 가드 클레이즈에서 토스터로 시작하는지 여부를 확인할 수도 있습니다. if
기능 본문 내부.
myFunc str =
case stripPrefix "toaster" str of
Just restOfString -> something restOfString
Nothing -> somethingElse
이것이 StrippRefix가 아마도 유형을 반환하는 이유입니다.
제휴하지 않습니다 StackOverflow