Project Eulerの問題59を解決しようとしています。この問題では、3文字のキー(すべて小文字)を持つメッセージをxor-decryptする必要があります。ASCIIでは、これはすべてのキーのセットが
let keys = [[a, b, c] | a <- [97..122], b <- [97..122], c <- [97..122]]
そして、次の関数が一緒にヒューリスティックにそれを復号化します。
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
基本的に、キーの1つがメッセージを復号化して「the」が含まれるまでキーを試し続けます(メッセージに一般的な英語の単語が含まれていることはわかっています)。しかし、私がバインドしkeys
てmessage
実行すると、try keys message
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
さて、私が言っlet keys = [map fromIntegral [a, b, c] | a <- [97..122], b <- 97..122],, c <- [97..122]]
ても、それはまだタイプがInteger
あり、そうではないInt
と言っています。また、私が試したときlet keys = map (map fromIntegral) keys
、そして私が使用したときもfromInteger
。どうしたの?