私はHaskell(および関数型プログラミング)の完全な初心者です。だから、頭と++で型を一致させることができません
--Datatype for a cipher
type Cipher = String
validateCipher :: Cipher -> Bool
validateCipher ciph =
if((length ciph) /= 26)then
False
else if(let savedChars = "" in vCiph ciph savedChars)then
True
else
False
vCiph :: Cipher -> String -> Bool
vCiph c sChars =
if(elem (head c) sChars)then
False
else if(length c == 0)then
True
else
sChars ++ (head c)
vCiph (tail c) sChars
:
Ciphers.hs:24:25:
Couldn't match expected type ‘Bool’ with actual type ‘[Char]’
In the expression: sChars ++ (head c)
と
Ciphers.hs:24:41:
Couldn't match type ‘Char’ with ‘[Char]’
Expected type: [[Char]]
Actual type: Cipher
これは私が実行しようとしているコードは次のとおりです。コードのかなりシンプルな作品をしようとしたとき、私はこの問題に遭遇しましたそれは本当に問題を引き起こしている最後の2つの行であり、私は理由を理解できません。正直なところ、最初の1つでは期待される型がboolである理由、なぜコンパイラの列番号がNotepad ++のものと一致しないのか、またはelse文の後に2行のコードを持つことが許されているかどうかはわかりません。どんな助けでも大変感謝しています。
「sChars ++(head c)vCiph(tail c)sChars」が何を意味するものであるかを理解しようとしています。 1つの式ですが、改行は何も意味しません。 –
ああ、本当ですか?私が真のハスケル・ノブだと言うとき、私は本当にそれを意味しています。私はライン・ブレイクがaの代わりに2つのステートメントを分けることを期待していました。 (他のすべての言語のように)。これらの行は、保存された文字のリストに最初の文字を追加して再帰することを目的としています。暗号はアルファベットの各文字の1つだけを含むことを確認することがポイントです。 –
ああ、あなたは、改行がハスケルの文を別々にするのは間違いありません。必要に応じて明示的に ';'を使用することもできます。しかし、あなたは何の記述も書いていません - あなたは純粋な機能を書いています。 –