2017-11-21 4 views
1

私はHaskellの初心者で、ASCII値をシフトしてプレーンテキストを暗号化しようとしています。プレーンテキストに数字が含まれている場合は、数字の代わりに特殊記号を入れてエンコードする必要があります0 = *、1 = '\'、2 =〜、3 =!、4 = @、5 =#、6 = $、7 =%、8 = ^、9 = &)以下は私のコードです入力 `= 'で構文解析エラーが発生しましたか?

私はそれをコンパイルするとき、私はそれが

encrypt2.hs:27:18: error: 
parse error on input `=' 
Perhaps you need a 'let' in a 'do' block? 
e.g. 'let x = 5' instead of 'x = 5' 
    | 
27 | Where wrapshift = let shift' = ord(shift) `mod` 26 
    |    ^
Failed, 0 modules loaded. 

以下I kのようなエラーを示す、 wrapshift機能を定義した(私はその犯人だと思う)が、している私の暗号化文字をラップアラウンドする これまで
import Data.Char 

isInRange :: Char -> Char -> Char -> Bool 
isInRange l u c = (c >= l) && (c <= u) 

--is this Letter to be ciphered 
canEncrypt :: Char -> Bool 
canEncrypt c = isLower(c) && isAscii(c) 

-should we wrap around the alphabet ? 
wraparound shift c 
| isLower c && ord(c)+shift > ord 'z' = True 
| otherwise = False 

--encrypt single char at a time 
encryptChar :: Char -> Char -> Char 
encryptChar :: Char -> Char -> Char 
encryptChar shift c 
    | canEncrypt c = chr (ord c + wrapshift) 
    | isUpper c = c 
    Where wrapshift = let shift' = ord(shift) `mod` 26 
        in if (wraparound shift' c) 
         then shift'-26 
         else shift' 
encryptChar _ '0' = '*' 
encryptChar _ '1' = '\'' 
encryptChar _ '2' = '~' 
encryptChar _ '3' = '!' 
encryptChar _ '4' = '@' 
encryptChar _ '5' = '#' 
encryptChar _ '6' = '$' 
encryptChar _ '7' = '%' 
encryptChar _ '8' = '^' 
encryptChar _ '9' = '&' 
encryptChar _ c = c 

encryptText :: String -> String -> String 
encryptText text xs = [ encryptChar x s | x <- xs, s <- text] 

とても良いです、私のソースファイルでtabsのためにこれらの種類のエラーが発生しますが、私は合計ファイルをチェックしてミスを見つけませんでした。私はここで何か間違っていると思います。なぜこのエラーは、私を助けてください発生している私はここで打たれていますが

+2

'wrapshift'は'どこでwrapshift' - 大文字小文字が重要なのでしょうか。 – chi

+1

有用な回答を受け入れることを検討してください。答えを受け入れることによって、それは正しい答えであることを将来の読者に示すことになります。 – zaph

+0

https://wiki.haskell.org/Keywords#where –

答えて

5
Where wrapshift 

ここwhereがキーワードとしてハイライトされていないか注意を.thank。それはあなたが大文字の「W」でそれを綴ったからです。

したがって、キーワードではなく識別子として解釈され、Where wrapshiftは前の式の引数として解釈されます(つまり、c Where wrapshiftは関数呼び出しと見なされます)。だからこそ、=があるとは思わない。

関連する問題