>
나는 다음과 같은 유형의 함수를 작성하려고 시도하고있다 :

partitionByFirstChar :: [String] -> Map.Map Char [String]

partitionByFirstChar xs   Map 를 반환합니다  그 키 목록 xs 에서 각 문자열의 첫 번째 문자입니다  그 값은 해당 문자열의 접미사 (즉, 첫 문자를 제외한 모든 문자)의 목록입니다.

이 작업을 수행하려는 시도는 다음과 같습니다.

partitionByFirstChar [] = Map.empty
partitionByFirstChar ((x:xs):xss)
  = ???
    where partitioned = partitionByFirstChar xss
          suffixes = partitioned !? x

이제 suffixes   Nothing 가 될 수 있습니다  또는 Just s . 그것이 Nothing 라면 나는 insert x [xs] partitioned 하고 싶다 . 그것이 Just s 라면 그런 다음 insert x (xs:s) partitioned 하고 싶습니다 .

나는 무엇을 suffixes 확인하는 방법을 알아내는 데 어려움이있어  입니다. 나는 내가 ??? 에 대한 패턴 매칭의 어떤 필요가 있다고 생각  하지만 알아낼 수는 없습니다.


  • 답변 # 1

    multimap 를 사용하고자하는 경우  패키지를 통해이 문제를 쉽게 해결할 수 있습니다.

    λ> import qualified Data.MultiMap as MM
    λ> MM.toMap . MM.fromList . fmap (\(x:xs) -> (x, xs)) $ ["apple", "avocado", "bagel"]
    fromList [('a',["pple","vocado"]),('b',["agel"])]
    
    

    fromListWith @Alec의 의견에서 지적했듯이 MultiMap 를 사용할 필요가 없다면 아마도 더 나은 선택 일 것입니다.  유형. 성능 인해 목록 연결에 큰되지 않을 수도 있지만.

    λ> import qualified Data.Map as M
    λ> M.fromListWith (<>) . fmap (\(x:xs) -> (x, [xs])) $ ["apple", "avocado", "bagel"]
    fromList [('a',["vocado","pple"]),('b',["agel"])]
    
    

  • 답변 # 2

    Now 와이즈 비즈   suffixes 가 될 수 있습니다  또는 Nothing . 그것이 Just s 라면 나는 Nothing 하고 싶다 . 그것이 insert x [xs] partitioned 라면 그런 다음 Just s 하고 싶습니다 .

    여기서 기본적인 접근 방식은 insert x (xs:s) partitioned 를 사용하는 것입니다 :

    case of
    
    

    위의 코드에는 여전히 빈 문자열에 대한 분기가 없습니다 (예 :

    partitionByFirstChar [] = Map.empty
    partitionByFirstChar ((x:xs):xss) = let
       partitioned = partitionByFirstChar xss
       suffixes = partitioned !? x
       in case suffixes of
          Nothing -> insert x [xs] partitioned
          Just s -> insert x (xs:s) partitioned
    
    
    partitionByFirstChar ("":xss) = partitionByFirstChar xss

관련 자료

  • 이전 java - 컴파일 프로세스의 어휘 분석 단계에서 javadoc 주석이 제거/제거됩니까? 최종 class 파일에 포함되어 있습니까?
  • 다음 해시 URL의 jquery 스크롤 탑