私はハスケルのパリンドロームチェッカーで作業していますが、頭と頭を使用する必要があります。私のエラーはif文についてですが、私はこれについて多くのバリエーションを試しましたが、なぜifが問題なのか理解できません。助けてください!ありがとうございました!エラーの場合はハスケル
palindrome2::String->Bool
palindrome2 xs = while xs==notEmpty if head xs == last xs then True else False
私はハスケルのパリンドロームチェッカーで作業していますが、頭と頭を使用する必要があります。私のエラーはif文についてですが、私はこれについて多くのバリエーションを試しましたが、なぜifが問題なのか理解できません。助けてください!ありがとうございました!エラーの場合はハスケル
palindrome2::String->Bool
palindrome2 xs = while xs==notEmpty if head xs == last xs then True else False
文字列が回文であるかどうかを確認する最も簡単な方法は、おそらく、それは自身の逆バージョンと同じだかどうかを確認するために、次のようになります。
isPalindrome :: String -> Bool
isPalindrome str = str == reverse str
しかし、あなたはhead
を使用する必要がありますと言ったので、 tail
は、私は、これらの機能を使用して実装を説明します:
palindrome2::String -> Bool
palindrome2 [] = True
palindrome2 xs = head xs == last xs && palindrome2 (take (length xs - 2) (tail xs))
私はあなたがwhile
をどうしようとしていたかわからないんだけど。おそらく、命令的言語から生じる何らかの混乱のようなものでしょうか?この実装は再帰的に動作し、リストの先頭が最後のタームと等しいかどうかをチェックし、等しい場合はリストに入れ子にします。最初の条件と最後の条件が等しくない(文字列が回文ではない)場合、または基本ケースに達すると(文字列が回文です)、評価は終了します。
最初の実装がはるかに効率的であることに注意してください。
ありがとう!私はちょうど学ぶようになったので、オブジェクト指向の言語を中心に作業した後、Haskellに慣れてきたので、私の傾向は強いです!私はここで何らかのループが必要であることを知っていたので、代わりに再帰を使ってHaskellでどのように行うことができるか理解できました。再度、感謝します! –
"最初の実装がはるかに効率的であることに注意してください。 - 確かに。 2番目の実装は2次です。これは 'length'と' last'はリストの長さが線形であるためです。 – duplode
@MaryCountsあとで試してみたいかもしれない1つのボーナスエクササイズは、あらかじめ定義されたリスト操作関数( 'reverse'、' last'など)なしで 'isPalindrome'を実装することです。 [このコードレビューの質問](http://codereview.stackexchange.com/q/64798)への回答の途中には素晴らしい解決策があります。 – duplode
他の言語の命令的なループを真似しようとしているようです。そうしないと、もっと混乱するだけです。特に、あなたがどこかでそれらを定義しない限り、 'while'と' notEmpty'は全く存在しません。 – duplode