문제

문자 '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가 아마도 유형을 반환하는 이유입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top