リスト内包表記に関する sepp2k の発言は、理解することが重要です。、などのリスト操作はmap、すべてのリスト項目を一様に扱います。それらについて理解する重要なことは、各ステップでどのような情報が利用できるか、および各ステップの結果が他のステップの結果とどのように組み合わされるかです。filterfoldr
しかし、私が強調したい側面は、これらの問題をライブラリ関数の観点から解決しようとするべきだと思うということです。私のこの古い回答から解決策をあなたの問題に適応させる:
deleteFirst x xs = beforeX ++ afterX
-- Split the list into two pieces:
-- * prefix = all items before first x
-- * suffix = all items after first x
where (beforeX, xAndLater) = break (/=x) xs
afterX = case xAndLater of
[] -> []
(_:xs) -> xs
トリックはbreak、「最初のヒットまで」の動作が既に組み込まれていることです。breakさらなる演習として、独自のバージョンの;を書いてみることができます。これらの小さくて汎用的で再利用可能な関数の書き方を学ぶことは、常に有益です。