1

Haskell で vigenere cypher を作成する必要があるコーディング プロジェクトに取り組んでいます。私は何時間も費やしましたが、ほとんど進歩がありませんでしたが、特定の部分で立ち往生しています。これまでの私のコードは次のとおりです。

--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]

私の問題は Encoding 関数にあります。関数で、キーとエンコードされるはずのメッセージの両方のインデックスごとに char を調べて変更する必要があります。私が持っているものはうまくいくはずだという印象を受けていますが、実行すると | のために解析エラーが発生します。in: (キー !! a) | a <-as)。それを修正する方法がわかりません。ましてや、プログラムが実際に各インデックスで文字を調べたり変更したりする方法もわかりません。誰か助けてくれませんか?

4

2 に答える 2

3

構文は次のとおりです。

[element | bindings, guards]

あなたの構文エラーは

  • 2つの|兆候があります
  • 要素部分が終了する前に最初|に発生します(括弧を数えます)

だから試してみてください

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必要な 3 つの引数を指定していないことを示すエラー メッセージが表示されて混乱しているとします。

zipWith引数を 1 つ指定しましたが、それはです(fst() key msg)

コードを変更することを想定していたのは、次のようなものでした

encode key msg = zipWith f (cycle key) msg
  where f keyElem msgElem = shift (26 - let2int keyElem) msgElem
于 2013-02-27T20:01:00.027 に答える
2

並列リスト内包表記を有効にすると ({-# LANGUAGE ParallelListComp #-}ファイルの先頭に貼り付けるか:set -XParallelListComp、GHCi に入力して)、次のように記述できます。

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 拡張機能に依存していません。素敵でコンパクトな書き方をお見せしたいと思いました。

于 2013-02-27T22:20:55.837 に答える