2017-05-04 1 views
2

하스켈에서 Int의 목록을 변경하여 특정 한도 내로 유지하려고하지만 작동하지 않는 것 같습니다. 목록에있는 모든 int를 32에서 127 사이에 두려고 노력하고 있지만 작동하지 않습니다. 왜 아무도 이것이 작동하지 않는 이유를 설명 할 수 있습니까?각 개인에 대한 제한 설정 방법

limit :: Int -> Int 
limit n | n > 127 = n `mod` 127 + 32 
     | n < 32 = n + 127 - 32 
     | otherwise = n 

limitList :: [Int] -> [Int] 
limitList [] = [] 
limitList (x:xs) = [limit x] ++ limitList xs 
+1

"127 ~ 32시에 앉는다"는 것은 무엇을 의미합니까? 이 범위 사이에 * 없다면 어떻게 될 것입니까? –

+1

n = 253으로하고 첫 번째 절이 원하는 것을 수행하지 않는 것으로 관찰하십시오. 두 번째 절과 비슷한 문제가 있습니다. 왜 32를 더하고 있니? – amalloy

+1

이 경계 사이에 있지 않으면 다시 돌아가고 싶습니다. int가 128이면 32가되고 int가 31이면 127이됩니다. –

답변

6

는 귀하의 의견을 바탕으로, 당신은 모듈로 변환을 적용하여 32-127 범위 하지이다 Int의 변환하고자합니다.

Prelude> helper 31 
127 
Prelude> helper 32 
32 
Prelude> helper 127 
127 
Prelude> helper 128 
32 

다음 우리의 기능 limitList 그 도우미와 만 map 핑입니다 :이 생성

limitList = map helper 
    where helper x = 32 + mod (x-32) (128-32) 

이 결과

helper x = 32 + mod (x-32) (128-32) 

: 그러므로 우리는 먼저 helper 기능을 구현할 수 있습니다 :

Prelude> limitList [1,4..256] 
[97,100,103,106,109,112,115,118,121,124,127,34,37,40,43,46,49,52,55,58,61,64,67,70,73,76,79,82,85,88,91,94,97,100,103,106,109,112,115,118,121,124,127,34,37,40,43,46,49,52,55,58,61,64,67,70,73,76,79,82,85,88,91,94,97,100,103,106,109,112,115,118,121,124,127,34,37,40,43,46,49,52,55,58,61,64] 
+0

감사합니다. –

관련 문제