質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.90%

Haskell リストからの取り出しについて

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 2,332

MtDew

score 8

リストが与えられたとき、偶数番目の要素だけを取り出す関数を作りたいのですが思うように作れません
kisuuhosii xs =zip xs (cycle ["Odd","Even"])を作って

ghci>kisuuhosii [1,2,3,4,5]
[(1,"Odd"),(2,"Even"),(3,"Odd"),(4,"Even"),(5,"Odd")]
となり、後は"Even"の含まれたタプルを消してfst関数を使えばうまく動くと思うのですが書き方がわかりません。
ヒントをお願いします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

4つ用意しました。

gusu1 :: [a] -> [a]
gusu1 [] = []
gusu1 [_] = []
gusu1 (_:x:xs) = x : gusu1 xs

gusu2 :: [a] -> [a]
gusu2 xs = [x | (i, x) <- zip [0..] xs, odd i]

gusu3 :: [a] -> [a]
gusu3 = map snd . filter (odd . fst) . zip [0..]

gusu4 :: [a] -> [a]
gusu4 = map snd . filter fst . zip (cycle [False, True])
  • gusu1
    パターンマッチ。リストが空であればもちろん空、1要素しかなければそれは奇数番目なのでこれも空、2要素以上有れば1番目を捨てて2番目のみ取り出して、残り(これは空の場合もある)に対して再帰すれば良い。

  • gusu2
    リスト内包表記。[0..]zipすることでインデックス付きのリストにする。あとはインデックスが奇数(0から始めているので)の時の要素だけでリストとするだけ。

  • gusu3
    gusu2のmap+filter版。やっていることはgusu2と同じで、書き方が違うだけ。ポイントフリースタイルで書ける。

  • gusu4
    gusu3でインデックスを使わない版。奇数番目がFalse、偶数番目がTrueになるリストをzipする。あとは、Trueになっている物をfilterして、mapで要素を取り出すだけ。

Q: なぜ、質問のコードを使わないのですか?
A: 文字列比較は遅いから。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/04/28 07:34

    gusu2とgusu3がシンプルでわかり易かったです。
    ありがとうございました。

    キャンセル

  • 2017/04/28 07:39

    オススメはgusu1だったんですけど…これぞHaskellというコードなので…(他の言語じゃ、まずできない)

    キャンセル

+1

どれくらいのヒントが必要なのかは分かりませんが、とりあえずfilter関数とmap関数を使えばできます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.90%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る