1

基本的に、私は問題を抱えています。haskellで関数を次のように機能させる方法:文字列の最初の要素を取得し、次に2番目の要素を取得して比較すると、関数は3番目の要素を取得し続ける必要があります文字列から、2番目と3番目のものを比較します。

最初の2つを比較し、次の2つを比較する必要がある場合は簡単ですが、この特定の状況では理解できません。

同じである2つの隣接する要素が見つかった場合はTrueを返し、そのような要素がない場合はFalseを返す関数を作成するには、この手順を実行する必要があります。

助けてくれてありがとう。

4

2 に答える 2

6

これを実現するための高次の方法(つまり、明示的な再帰なし)はzipWith、リスト内の要素を最初から開始して、リスト内の要素に対して2番目から開始して(を使用してtail)ポイントごとの比較を実行するために使用することです。 、次にを使用orして、ポイントごとの結果を1つの結果に折りたたみます。zipWith2番目の引数が空のリストである場合、3番目の引数は厳密ではないため、空のリストを特別な場合にする必要はありません。

編集:解決策(ホバーして表示)

hasNeighbors as = or . zipWith (==) as $ tail as

于 2012-05-09T23:52:24.217 に答える
2

この問題を解決する再帰関数を作成できます。処理しなければならない状況は3つあります。

  1. 関数が空のリストまたは1つの要素のリストを取得した場合、明らかにネイバーは含まれないため、を返しFalseます。
  2. リストが等しくない2つの項目で始まる場合は、隣接するペアで始まっていないことを意味するため、最初の要素を除くすべてのリストでチェックを実行する必要があります。
  3. リストが等しい2つの項目で始まる場合、リストに隣接ペアが含まれていることがわかっているので、を返すことができますTrue

これを行うコードを提供してほしいのか、それ以上のヒントが必要ないのかを教えてください。

編集:解決策(ホバーして表示)

hasNeighbors :: Eq a => [a] -> True
hasNeighbors (a : allExceptA @ (b : _))
  | a == b = True
  | otherwise = hasNeighbors allExceptA
hasNeighbors _ = False

于 2012-05-09T23:43:03.947 に答える