2016-11-04 3 views
2

私はハスケルのパリンドロームチェッカーで作業していますが、頭と頭を使用する必要があります。私のエラーはif文についてですが、私はこれについて多くのバリエーションを試しましたが、なぜifが問題なのか理解できません。助けてください!ありがとうございました!エラーの場合はハスケル

palindrome2::String->Bool 
palindrome2 xs = while xs==notEmpty if head xs == last xs then True else False 
+5

他の言語の命令的なループを真似しようとしているようです。そうしないと、もっと混乱するだけです。特に、あなたがどこかでそれらを定義しない限り、 'while'と' notEmpty'は全く存在しません。 – duplode

答えて

2

文字列が回文であるかどうかを確認する最も簡単な方法は、おそらく、それは自身の逆バージョンと同じだかどうかを確認するために、次のようになります。

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をどうしようとしていたかわからないんだけど。おそらく、命令的言語から生じる何らかの混乱のようなものでしょうか?この実装は再帰的に動作し、リストの先頭が最後のタームと等しいかどうかをチェックし、等しい場合はリストに入れ子にします。最初の条件と最後の条件が等しくない(文字列が回文ではない)場合、または基本ケースに達すると(文字列が回文です)、評価は終了します。

最初の実装がはるかに効率的であることに注意してください。

+1

ありがとう!私はちょうど学ぶようになったので、オブジェクト指向の言語を中心に作業した後、Haskellに慣れてきたので、私の傾向は強いです!私はここで何らかのループが必要であることを知っていたので、代わりに再帰を使ってHaskellでどのように行うことができるか理解できました。再度、感謝します! –

+2

"最初の実装がはるかに効率的であることに注意してください。 - 確かに。 2番目の実装は2次です。これは 'length'と' last'はリストの長さが線形であるためです。 – duplode

+1

@MaryCountsあとで試してみたいかもしれない1つのボーナスエクササイズは、あらかじめ定義されたリスト操作関数( 'reverse'、' last'など)なしで 'isPalindrome'を実装することです。 [このコードレビューの質問](http://codereview.stackexchange.com/q/64798)への回答の途中には素晴らしい解決策があります。 – duplode

関連する問題