1. ホーム
  2. haskell

[解決済み] Haskell takeWhile + 1

2022-03-01 11:43:38

質問

条件にマッチしない最初の要素を保持するtakeWhileはどのように書けばいいのでしょうか?

例(明らかに私の例はこれよりトリッキーです):

の代わりに takeWhile (\× - > x! = 3) [1..10] を返すように [1,2] 必要なのは [1,2,3] .

私が考えたのは (takeWhile myFunc myList) ++ [find myFunc myList] しかし、これではリストを2回見直すことになる...。

何かアイデアはありますか?

解決方法は?

自分で転がすことができる。

takeWhileOneMore :: (a -> Bool) -> [a] -> [a]
takeWhileOneMore p = foldr (\x ys -> if p x then x:ys else [x]) []

と比較します。

takeWhile :: (a -> Bool) -> [a] -> [a]
takeWhile p = foldr (\x ys -> if p x then x:ys else []) []

明示的な再帰も問題ないでしょう。

takeWhileOneMore :: (a -> Bool) -> [a] -> [a]
takeWhileOneMore p [] = []
takeWhileOneMore p (x:xs) = 
   if p x
   then x : takeWhileOneMore p xs
   else [x]