5

私はこのコミュニティの新人です。私は Haskell を学んでいますが、Haskell コーディングに苦労しています。あなたが私を助けてくれることを願っています。

こことGoogleで検索しましたが、成功しませんでした。

私の問題は次のとおりです。次のようにリストをパラメーターとして受け取る関数を書きたいと思います。

myStringListFilter :: [String] -> [String]

次の手順を処理します。

  1. 最初の文字を削除

    myStringListFilter myList = map tail strListe myList
    
  2. 「u」または「U」で始まるリスト内のすべての要素をフィルタリングします。

    myStringListFilter myList = filter (´elem´ ['u', 'U']) (map tail strListe myList)
    

ステップ 2 は機能しません。エラーが発生します。

以下が必要な場合、どうすれば解決策を達成できますか。

Input: ["butter", "chees", "aUbergine", "egg", "milk", "bUbble", "curry"]

Output: ["chees", "egg", "milk"]
4

3 に答える 3

9

のタイプfilter

filter :: (a -> Bool) -> [a] -> [a]

Stringしたがって、述語に従って s のリストをフィルタリングする場合は、 function が必要ですString -> Boolが、あなたが書いたものに(`elem` ['u',U'])は type がありChar -> Boolます。

だからあなたは関数が必要です

beginsWithU :: String -> Bool

それを定義する最も簡単な方法は

beginsWithU (c:_) = c == 'u' || c == 'U'
beginsWithU _ = False                      -- empty list

filter次に、どのように機能するかを誤解し、述語を満たす要素を保持し、それらを削除したいので、述語を a で構成する(または as を直接not定義する) 必要があります。doesn'tbeginWithU

ただし、7stud が 指摘しているように、元のリストから保持したい要素を実際に変更する必要はありません。

myStringListFilter myList = filter (not . beginsWithU) (map tail myList)

または、ポイントフリー:

myStringListFilter = filter (not . beginsWithU) . map tail

達成するでしょう。したがってtail、述語にもthe を組み込む必要がありmap、 no は必要ありません。

myStringListFilter = filter (not . beginsWithU . tail)

Stringまたは、入力リストに空が発生する可能性が無害に処理される場合、

myStringListFilter = filter (not . beginsWith . drop 1)

sincetail ""は を生成し*** Exception: Prelude.tail: empty listますが、はdrop 1 ""を生成し""ます。

ただし、元のリスト要素を保持したい場合は、2 番目の文字を直接見る述語を定義することもできます。

secondCharIsU :: String -> Bool
secondCharIsU (_:c:_) = c == 'u' || c == 'U'
secondCharIsU _       = False

myStringListFilter = filter (not . secondCharIsU)
于 2013-05-05T23:35:58.613 に答える