2012-01-21 4 views
2

나는 Problem 15을하고있다.H-15에 문제가있다

(**) Replicate the elements of a list a given number of times. 

    Example: 

    * (repli '(a b c) 3) 
    (A A A B B B C C C) 

    Example in Haskell: 

    > repli "abc" 3 
    "aaabbbccc" 

내 계획이 그런 짓을했다 : 어떤 상태 내가 한 요소 Y 시간의 목록을 반환 appendNo라는 함수를 만들 것

repli :: [a] -> Integer -> [a] 

repli [] y = [] 

repli (x:xs) y | appendNo x y == [] = repli(xs) y 
       | otherwise = appendNo x y : (x:xs) 
       where 
       appendNo :: a -> Integer -> [a] 
       appendNo a 0 = [] 
       appendNo a y = a:appendNo a (y-1) 

는 원래 목록에 추가 . 그런 다음 목록의 본문을 가져 와서 더 이상 본문 요소가 없어 질 때까지이 과정을 반복하십시오.

H15.hs:6:30: 
    Couldn't match type `a' with `[a]' 
     `a' is a rigid type variable bound by 
      the type signature for repli :: [a] -> Integer -> [a] at H15.hs:3:1 
    In the return type of a call of `appendNo' 
    In the first argument of `(:)', namely `appendNo x y' 
    In the expression: appendNo x y : (x : xs) 
Failed, modules loaded: none. 

6:30이 줄에 appendNop에에 있습니다 : : 그러나, 나는 오류가 나는 수행하여 알아낼 수 있었다 dave4420

  | otherwise = appendNo x y : (x:xs) 

확인 감사 :

repli :: [a] -> Integer -> [a] 

repli [] y = [] 

repli (x:xs) y = appendNo x y ++ repli(xs) y 
       where 
       appendNo :: a -> Integer -> [a] 
       appendNo a 0 = [] 
       appendNo a y = a:appendNo a (y-1) 
+2

이이 직접 입력 오류와 관련이없는,하지만 고려 이 문제를 부분으로 분해하고 각 부분을 수행하기위한 도구가 있는지 확인하십시오. | 다시 함께 – Tyler

+0

참고 이러한 문자 모인 1) 문자 반복 각 문자 2)에 뭔가를하고있는 N 시간 3) 그': 이 솔루션 3 개 일반적인 부분이 있습니다 appendNo x y == []'대문자는 필요 없습니다. 다른 경우는 충분히 잘 작동합니다. – Rotsor

답변

4
 | otherwise = appendNo x y : (x:xs) 

이 줄에는 형식 오류가 있습니다. 자문 해보십시오.

  1. appendNo x y 유형은 무엇입니까?
  2. (x:xs) 유형은 무엇입니까?
  3. (:) 유형은 무엇입니까?

그런 다음 왜 일치하지 않는지 확인할 수 있습니다. 그들이 일치하지 않는 이유가 여전히 볼 수없는 경우

, 자신에게

  1. x의 유형은 무엇을 물어?
  2. xs 유형은 무엇입니까?
  3. (:) 유형은 무엇입니까?

이번에는 을 수행 할 때과 일치해야합니다.

+0

그래, 지금 다른 오류가 있습니다 ...하지만,': t (:)'를 쓰면'(:)'를'(++)'로 바꾸어야한다고 알려줍니다. 감사. – Dair

+0

감사합니다. 지금 완전히 작동하고 있습니다. – Dair

1

문제가 해결되면서 힌트를 드리겠습니다. "루프"가 아니라의 변형 을 생각해보십시오. n = 3 및 list = "ABCD"와 같은 구체적인 값으로 시작하십시오. 그런 다음 "모든 요소가 세 번 필요합니다"라는 줄을 생각해 봐야합니다. 놀랍게도 replicate이라는 복제를 수행하는 기능이 이미 있습니다. 따라서 문장은 map (replicate 3) "ABCD"으로 번역되어 ["AAA","BBB","CCC","DDD"]이됩니다. 그게 거의 당신이 원하는거야, 당신은 단지 concat 요소가 필요합니다. 이는 범이 작업은 매우 일반적인

repli list n = concat (map (replicate n) list) 

때문에 concatmap를 결합 concatMap 기능뿐만 아니라 오퍼레이터 (>>=) 동일하고 단지 대칭 인수와 함께 존재한다.

repli list n = list >>= replicate n 

이는 DO-표기 나뿐만 아니라 지능형리스트로 변환 할 수 있습니다 : 그래서 아주 짧은 솔루션이 될 것

repli list n = do 
    x <- list 
    y <- replicate n x 
    return y 

repli list n = [y | x <- list, y <- replicate n x] 
관련 문제