当前位置:  开发笔记 > 程序员 > 正文

Haskell takeWhile + 1

如何解决《HaskelltakeWhile+1》经验,为你挑选了2个好方法。

如何编写一个takeWhile来保持第一个与条件不匹配的元素?

示例(显然我的例子比这更棘手):

而不是takeWhile (\× - > x! = 3) [1..10]回归[1,2]我需要[1,2,3].

我想到了,(takeWhile myFunc myList) ++ [find myFunc myList]但这意味着我需要通过我的清单2次...

任何的想法?



1> David Fletch..:

你可以使用spanbreak.

?> span (/=3) [1..10]
([1,2],[3,4,5,6,7,8,9,10])

所以你可以这样做:

takeWhileInc :: (a -> Bool) -> [a] -> [a]
takeWhileInc p xs = case zs of [] -> error "not found"
                               (z:_) -> ys ++ [z]
  where
    (ys, zs) = span p xs

(或者无论你想要发生什么zs,因为没有3 找到它是空的.)



2> chi..:

你可以自己动手.

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]


@AugustinRiedinger`fromJust`是最好避免的.用"Nothing"喂它会使程序崩溃.很少需要所有潜在崩溃的函数,如"head,tail,fromJust,...",通常最好假装它们不存在,利用模式匹配和/或更安全("总")函数.我在上面添加了一个更基本的替代方案,没有`foldr`.
推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有