2012-10-20 3 views
3

나는 Project Euler 문제 59를 해결하려고합니다. 여기서는 3 자 키 (모두 소문자)를 가진 메시지를 xor-decrypt해야합니다. 내가하려고 키를 계속 기본적으로Haskell Integer 및 Int 유형; 변환이 작동하지 않습니다

decrypt :: [Int] -> [Int] -> [Char] 
decrypt msg xs = map chr $ zipWith xor msg $ (concat . repeat) xs 

try :: [[Int]] -> [Int] -> [Char] 
try kys msg = head $ filter (isInfixOf "the") $ map (decrypt msg) kys 

을 그들 중 하나가 메시지를 해독 할 때까지 : ASCII에서이 모든 키 세트가

let keys = [[a, b, c] | a <- [97..122], b <- [97..122], c <- [97..122]] 

이며, 다음과 같은 기능을 함께 경험적 암호를 해독 할 의미 그 안에 "the"이 있습니다 (나는 메시지에 공통된 영어 단어가 있음을 압니다). 내가 try keys messagekeysmessage을 결합하고 실행하지만 난 여전히 그것을 입력이 말한다 let keys = [map fromIntegral [a, b, c] | a <- [97..122], b <- 97..122],, c <- [97..122]] 말을해도, 지금

Couldn't match expected type `Int' with actual type `Integer' 
    Expected type: [[Int]] 
     Actual type: [[Integer]] 
    In the first argument of `try', namely `keys' 
    In the expression: try keys message 

를 얻을 수 Integer하지 Int 또한 내가 let keys = map (map fromIntegral) keys을하려고 할 때, 나는 fromInteger을도를 사용하는 경우. 무슨 일이야?

답변

4

keys 유형의 기본값은 [[Integer]]입니다. keys을 정의 할 때 유형 약어를 추가하여,이 메소드를 오버라이드 (override) :

let keys = ... :: [[Int]] 

이 숫자 리터럴의 유형 (및 fromIntegral의 반환 형식이) 다형성, 그래서 때문에 당신은 let keys = ...monomorphism restriction에서 차기 및 기본값 숫자를 쓸 때 다른 유형으로 제한되지 않는 한 Integer에 입력합니다.

> let x = 42 
> :t x 
x :: Integer 
> let y = 42 :: Int 
> :t y 
y :: Int 

또 다른 해결책은 모노 형태 제한을 비활성화하는 것입니다. 그러면 keys은 사용하려고 시도 할 때 [[Int]]으로 특수화되는 다형성 값이됩니다.

> :set -XNoMonomorphismRestriction 
> let x = 42 
> :t x 
x :: Num b => b 
+0

미래에이 질문을 읽는다면'let keys = [[a, b, c] | a Intral [97..122] :: [Int], b <-지도 fromIntegral [97..122] :: [Int], c <-지도 fromIntegral [97..122] :: [Int] ]'정확한 코드는 그것을 고쳤다. 또한, 고마워 함마, 나는이 형태의 형형 변환을 알지 못했습니다. – jclancy

+4

@jclancy 리터럴 중 하나 이상에 대해 'Int'유형을 지정하거나'[97 .. 122]'목록 중 (적어도) 하나에 대해'[Int]'를 지정하면'[[ Int]]''keys'의 경우, fromIntegral은 필요 없습니다. –

+0

아, 전에는 저에게 맞지 않는 어떤 이유로 오타 일 수도 있습니다. 그러면 가장 좋은 해결책은'let keys = [[a, b, c] | a <- [97..122], b <- [97..122], c <- [97..122]] :: [[Int]]' – jclancy

관련 문제