2017-05-04 16 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とし、最初の句があなたの望むことをしていないことを確認します。 2番目の節にも同様の問題があります。なぜあなたは32を追加していますか? – amalloy

+1

もしこれらの境界の間にないなら、私はそれをループバックしたいので、intが128の場合は32に、intが31の場合は127にします。 –

答えて

6

、あなたはモジュロ変換を適用することにより、32から127の範囲でではありませんInt Sを変換したいです。

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

次の当社機能limitListはそのヘルパーを持つ唯一のmapのpingです::これは発生

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

これはうまくいきました! –

関連する問題