1

입력으로리스트를 얻는 하스 켈에서 해밍 함수를 작성하고 싶습니다. 나는 이미 이것을 가지고있다 :하스 켈리스트로 해밍하기

merge :: [Integer] -> [Integer] -> [Integer] 
    merge (x:xs)(y:ys) 
     | x == y = x : merge xs ys 
     | x < y = x : merge xs (y:ys) 
     | otherwise = y : merge (x:xs) ys 


hamming :: [Integer] 
hamming 
    = 1 : merge (map (2*) hamming) (merge (map (3*) hamming) (map (5*) hamming)) 

그것은 쉬웠다. 하지만 이제는 "해밍 [4,6,7,9]"과 같은 것을 입력으로 원합니다. 실제 입력은 1이지만 입력은 목록이어야하며 목록에있는 모든 숫자는 해밍 목록에 있어야합니다. 그리고 물론 2x 3x와 5x가 목록에 있습니다.

난 그냥 목록을 테스트 할 수 있지만 작동하지 않습니다

"hamming (x:xs) = x : merge (map (2*) hamming) (merge (map (3*) hamming) (map (5*) hamming))"

같은 것을 썼다.

+0

'map (3 *) hamming '이해야 할 것은 무엇입니까? 함수 (*!)의 * 요소 *에 3을 곱하고 싶습니까? –

답변

1

비록 이것이 duplicate이지만 솔루션에 어떻게 도달 할 수 있는지 보여 드리겠습니다. 복제본에 나타나는 것은 무엇입니까? 여기 내 초점은 목적지가 아닌 여행에 더 초점을 맞출 것입니다. 시도했습니다

hamming (x:xs) 
    = 1 : merge (map (2*) hamming) (merge (map (3*) hamming) (map (5*) hamming)) 

여기 무슨 일이 일어나고 있습니까? 그것은 기능입니까? 목록? 여기 모두 뒤죽박죽입니다. 엉망이야. 목록 정의를 함수로 바꾸고 싶다면 hamming [2,3,5]이라고 말하면됩니다. 하지만 그때 무엇에 들어가야한다 map 표현? 함수 호출 hamming [2,3,5]도 마찬가지입니까?

그러나 우리는 명시 적으로 몇 가지 별도의 장소에서 여기 같은 목록을 사용하는 것처럼 즉, 목적을 물리 칠 것은, 각각에 자신의 포인터를 유지 세 (또는 가능 더 ...) map들 즉, 공유 시퀀스. 그리고 동등한 경우 라 할지라도 별도의 함수 호출을 만드는 것은 (거의 확실하고 거의 확실하게) 3 개의 서로 다른 동등한리스트를 생성 할 것입니다. 그리고 그것은 이 아닙니다. 우리가 여기서 필요로하는 것입니다. (실제로 이것은 재미있는 연습이며, 시도해 보면서 배가 고프고 느린 메모리가 얼마나 많은지보십시오).

그래서, 귀하의 우려를 분리하십시오! 다시 쓰기 h 공유 목록입니다, 당신은

hamming :: [Integer] -> [Integer] 
hamming [2,3,5] = h where 
    h = 1 : merge (map (2*) h) (merge (map (3*) h) (map (5*) h)) 
    = 1 : merge (map (2*) h) (merge (map (3*) h) (merge (map (5*) h) [])) 
즉, 여러분이 원하는 모든 함수, hamming을 만들 수있는 자유가 첫 번째 (여전히 유효)로 지금

hamming (x:xs) = h where 
    h = 1 : merge (map (2*) h) (merge (map (3*) h) (map (5*) h)) 

그것을 인

,

 = 1 : foldr merge [] [map (p*) h | p <- [2,3,5]] 

 g a (g b (g c (... (g n z) ...))) 
    = 
     foldr g z [a,b,c,...,n] 
012,351,641 때문에

거기에는 매개 변수의 평범한 이름 바꾸기까지의 답변이 있습니다.

머지 소트 그대로 연상되고, 중복을 건너 뛸 안된다 "병합"로, unionmerge 기능의 이름을 변경하는 것을 잊지 마십시오. 파일의 동일한 들여 쓰기 수준에서 시작하는 모든 정의를 유지하십시오.

관련 문제