2013-02-27 65 views
1

我正在編寫一個編碼項目,我們需要在Haskell中編寫一個vigenere密碼。我花了幾個小時,取得了一些進展,但我陷入了一個特定的部分。這是我到目前爲止的代碼:在Haskell中使用vigenere密碼編碼文本時遇到困難

--Program: VigCipher.hs 
--Author: Mouse 

import Data.Char 
import Text.Printf 

--Changes letters to their numerical value 
let2int :: Char -> Int 
let2int c = ord c - ord 'a' 

--Changes numerical values to letters 
int2let :: Int -> Char 
int2let n = chr (ord 'a' + n) 

--Shift letter by n mod 26 places 
shift :: Int -> Char -> Char 
shift n c | isLower c = int2let ((let2int c + n) `mod` 26) 
     | otherwise = c 

--Encoding function 
encode   :: String -> String -> [Char] 
encode key msg = [shift (26 - let2int (key !! a) | a <- as) (msg !! a) | x <- zip (cycle key)msg] 

我的問題是在編碼功能:我想要的功能檢查和重點並應該要編碼的消息都的各項指標在改變焦炭。我的印象是我應該工作,但是當我運行它時,由於|,我得到了解析錯誤在:(key !! a)|一個< - as)。我不知道如何解決這個問題,更不用說如何真正讓程序檢查/更改每個索引處的字母,就像我想要的那樣。有人可以幫忙嗎?

+1

如果包含錯誤 – 2013-02-27 19:56:15

回答

3

語法

[element | bindings, guards] 

你的語法錯誤是

  • 有兩個|跡象
  • 第一|元素部分已經完成之前發生(算上括號)

所以試試

encode key msg = [shift (26 - let2int (key !! a)) (msg !! a) 
       | a <- as, x <- zip (cycle key) msg] 

您的下一個錯誤是因爲您沒有在任何地方定義as。 (你似乎沒有使用x。)


編輯:在評論,你說你已經改變了你的代碼

encode key msg = [shift (26 - let2int (x)) (msg) | x <- zipWith (fst() key msg)] 

,你說你是那個迷茫您收到一條錯誤消息,指出您沒有給出它需要的三個參數zipWith

您給出了zipWith一個參數,它是(fst() key msg)

我設想你改變你的代碼,是像

​​
+0

,那麼如果我希望它通過消息的每個索引並對其進行更改,那麼我應該更改長度(msg)嗎? – Mouse 2013-02-27 20:03:25

+0

不,因爲'as'必須是一個列表。所以用'[0 .. length msg - 1]'替換它。但請注意,使用'!!'通常是一個壞主意(鏈接列表不是數組),你可以用'zipWith'來重寫'shift'表達式並完全去掉'a'變量。 – dave4420 2013-02-27 20:07:31

+0

by rewrite你是說重寫shift方法還是重寫我在編碼方法中使用shift的地方? – Mouse 2013-02-27 20:14:27

2

隨着parallel list comprehensions啓用(通過,或者通過輸入GHCI :set -XParallelListComp在你的文件的頂部貼{-# LANGUAGE ParallelListComp #-}),你可以寫:

encode key msg = [shift (26 - let2int k) m | k <- cycle key | m <- msg] 

這將被脫到

encode key msg = [shift (26 - let2int k) m | (k,m) <- zip (cycle key) msg] 

這與

相同
encode key msg = zipWith (\k m -> shift (26 - let2int k) m) (cycle key) msg 

即dave4420的解決方案。他的解決方案更具慣用性,並且不依賴於GHC擴展 - 所以儘量使用這個擴展!只是覺得我會展示一個很好的書寫方式。

+0

+1爲平行列表理解的鏈接,謝謝我學到了新東西:) – zurgl 2013-03-01 13:47:00