テキストを受け取り、いくつかの単語を変更するプログラムが必要です。特に、「Chiara」を読み取るたびに「Leonardo」と書き込む必要があります。その逆も同様です。これは私のコードです:
changeText [] = []
changeText (x:xs)
| x == "C" = isChiara x xs
| x == "L" = isLeo x xs
| otherwise = x ++ changeText x
isChiara x xs
| nome == "hiara" = "Leonardo" ++ changeText (drop 5 xs)
| otherwise = x ++ changeText xs
where nome = take 5 xs
isLeo x xs
| nome == "eonardo" = "Chiara" ++ changeText (drop 7 xs)
| otherwise = x ++ changeText xs
where nome = take 7 xs
ただし、実行しようとすると、次のエラーが発生します。
main.hs:10:1: error:
Couldn't match type `[Char]' with `Char'
Expected type: [Char] -> [Char]
Actual type: [[Char]] -> [Char]
main.hs:17:13: error:
* Couldn't match type `Char' with `[Char]'
Expected type: [[Char]]
Actual type: [Char]
* In the second argument of `(==)', namely `"hiara"'
In the expression: nome == "hiara"
In a stmt of a pattern guard for
an equation for `isChiara':
nome == "hiara"
main.hs:17:49: error:
* Couldn't match type `[Char]' with `Char'
Expected type: [Char]
Actual type: [[Char]]
* In the first argument of `changeText', namely `(drop 5 xs)'
In the second argument of `(++)', namely `changeText (drop 5 xs)'
In the expression: "Leonardo" ++ changeText (drop 5 xs)
main.hs:18:33: error:
* Couldn't match type `[Char]' with `Char'
Expected type: [Char]
Actual type: [[Char]]
* In the first argument of `changeText', namely `xs'
In the second argument of `(++)', namely `changeText xs'
In the expression: x ++ changeText xs
main.hs:22:13: error:
* Couldn't match type `Char' with `[Char]'
Expected type: [[Char]]
Actual type: [Char]
* In the second argument of `(==)', namely `"eonardo"'
In the expression: nome == "eonardo"
In a stmt of a pattern guard for
an equation for `isLeo':
nome == "eonardo"
main.hs:22:49: error:
* Couldn't match type `[Char]' with `Char'
Expected type: [Char]
Actual type: [[Char]]
* In the first argument of `changeText', namely `(drop 7 xs)'
In the second argument of `(++)', namely `changeText (drop 7 xs)'
In the expression: "Chiara" ++ changeText (drop 7 xs)
main.hs:23:33: error:
* Couldn't match type `[Char]' with `Char'
Expected type: [Char]
Actual type: [[Char]]
* In the first argument of `changeText', namely `xs'
In the second argument of `(++)', namely `changeText xs'
In the expression: x ++ changeText xs
Failed, modules loaded: none.
何が問題になっていますか?私はHaskellにまったく慣れておらず、同様の問題に対する答えを探そうとしましたが、何が起こっているのかを理解するのは本当に本当に難しいです。
Haskellの文字列はCharのリストです。Haskellはそのタイプを[Char]
。
あなたが書く'C'
と、HaskellはこれをCharとして解釈しC
ます。
を書く"C"
と、Haskellはこれを1文字の文字列「C」として解釈します。
そして、Haskellは正しいタイプの使用について衒学者です。
したがって、より具体的な解決策を提供するには、次のようにします。
問題は最初の部分にあります。
changeText (x:xs)
| x == "C" = isChiara x xs
| x == "L" = isLeo x xs
| otherwise = x ++ changeText xs
これx
はCharですが、Haskellが1文字の文字列として解釈する"C"
orと比較します"L"
。
成功する:
changeText (x:xs)
| x == 'C' = isChiara x xs
| x == 'L' = isLeo x xs
| otherwise = x ++ changeText xs
そして、エラーメッセージは消えるはずです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加