- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有类似以下内容:
[bla z|n<-[0..], let z = foo n, z < 42]
问题是,我希望列表理解尽快结束 z < 42
失败了,就好像它是一个 takeWhile 一样。我知道我可以将其重构为一堆过滤器和映射,但通过列表理解它会更加优雅。
结合列表推导式和 takeWhile 的最优雅的方式是什么?
最佳答案
由于列表推导不允许这样做,所以我使用 monad 推导并定义了一个自定义 monad。其结果是以下工作:
example :: [Int]
example = toList [1000 + n
| n <- fromList [0..]
, _ <- nonStopGuard (n > 1)
, let z = 10*n
, _ <- stopGuard (z < 42) ]
-- Output: [1002,1003,1004]
上面的工作原理与正常的列表理解相同,但有两种不同类型的防护。一个nonStopGuard
除了需要奇怪的语法之外,它可以用作常规防护。一个stopGuard
相反,它会做更多的事情:一旦它变为 false,它就会停止考虑之前的生成器(例如 <-[0..]
)中的进一步选择。
我写的小库如下所示:
{-# LANGUAGE DeriveFunctor, MonadComprehensions #-}
import Control.Monad
import Control.Applicative
data F a = F [a] Bool
deriving (Functor, Show)
Bool
上面是一个停止位,表明我们必须停止考虑进一步的选择。
instance Applicative F where pure = return; (<*>) = ap
instance Monad F where
return x = F [x] False
F [] s >>= _ = F [] s
F (x:xs) sx >>= f = F (ys ++ zs) (sx || sy || sz)
where
F ys sy = f x
F zs sz = if sy then F [] False else F xs sx >>= f
最后if
将丢弃 xs
部分时f x
信号停止。
nonStopGuard :: Bool -> F ()
nonStopGuard True = F [()] False
nonStopGuard False = F [] False
普通 guard 从不示意停止。它只提供一个或零个选择。
stopGuard :: Bool -> F ()
stopGuard True = F [()] False
stopGuard False = F [] True
停止警戒一旦变为错误,就会发出停止信号。
fromList :: [a] -> F a
fromList xs = F xs False
toList :: F a -> [a]
toList (F xs _) = xs
最后一个警告:我不完全确定我的 monad 实例定义了一个实际的 monad,即它是否满足 monad 定律。
<小时/>根据@icktoofay的建议,我编写了一些快速检查测试:
instance Arbitrary a => Arbitrary (F a) where
arbitrary = F <$> arbitrary <*> arbitrary
instance Show (a -> b) where
show _ = "function"
prop_monadRight :: F Int -> Bool
prop_monadRight m =
(m >>= return) == m
prop_monadLeft :: Int -> (Int -> F Int) -> Bool
prop_monadLeft x f =
(return x >>= f) == f x
prop_monadAssoc :: F Int -> (Int -> F Int) -> (Int -> F Int) -> Bool
prop_monadAssoc m f g =
((m >>= f) >>= g)
==
(m >>= (\x -> f x >>= g))
运行 100000 次测试没有发现反例。所以,上面的F
很可能是这样的是一个实际的单子(monad)。
关于list - "takeWhile"在列表理解中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29319771/
在我针对 SQL Server 2012 实例运行的以下 Linq 查询中,我尝试读取最新记录,直到之前建立的 MasterId标记(这是一个 Guid )。 var cdc = crm.CdcCon
我正在运行以下代码: val it = List(1,1,1,2,2,3,3).iterator.buffered val compare = it.head it.takeWhile(_ ==
我有一些从 Haskell 调用的用 C 语言编写的函数。这些函数返回 IO (CInt) .有时我想运行所有函数,而不管它们返回什么,这很容易。为了示例代码,这是当前正在发生的事情的一般概念: Pr
我有一个 RxJS5 管道看起来像这样 Rx.Observable.from([2, 3, 4, 5, 6]) .takeWhile((v) => { v !== 4 }) 我想保留订阅直到看到
我是 Haskell 的新手,正在尝试执行以下操作: takeWhile (length < 3) [[1],[1,2],[1..3],[1..4]] .但这给出了一个错误,我认为这是因为 takeW
我有类似以下内容: [bla z|n 1) , let z = 10*n , _ ) = ap instance Monad F w
我想要一些能够有效地执行与 TakeWhile 相同但返回两个序列的东西: TakeWhile 的结果 1. 删除了输入序列的其余部分 我知道我可以做这样的事情: var a = input.Take
如何编写一个 takeWhile 来保留第一个不符合条件的元素? 示例(显然我的示例比这更棘手): 而不是 takeWhile (\× - > x! = 3) [1..10]返回 [1,2]我需要[1
我想要一些能够有效地执行与 TakeWhile 相同但返回两个序列的东西: TakeWhile 的结果 1. 删除了输入序列的其余部分 我知道我可以做这样的事情: var a = input.Take
似乎没有 e.TakeWhile(predicate, atLeastNElements) 重载。有没有一种方便的方式来表达TakeWhile,但是,如果有>= N个元素可用的话,至少要取N个元素。?
如何使用折叠在 Haskell 中实现 takeWhile 函数? takeWhile :: (a -> Bool) -> [a] -> [a] 我尝试了一种类似于实现这样的过滤器的策略 filter
我想知道是否有办法添加根据方法 takeWhile() 的条件测试的流的最后一个元素。我相信我想实现类似于 RxJava 的 takeUntil() 方法的东西。 我猜没有直接的方法可以做到这一点(如
有 public static IEnumerable FibonacciNumbers() { long current = 0; long next = 1; while (true) {
我想在 LINQ to Objects 上使用 LINQ TakeWhile 函数。但是,我还需要知道“破坏”函数的第一个元素,即条件不成立的第一个元素。 是否有一个函数可以获取所有不匹配的对象以及第
takeWhile() 与 Java 9 中的 filter() 有何不同。它有什么额外的实用程序? Stream.of(1,2,3,4,5,6,7,8,9,10).filter(i -> i i
我正在使用 takeWhile 创建片段来探索它的可能性。与 flatMap 配合使用时,行为不符合预期。请在下面找到代码片段。 String[][] strArray = {{"Sample1",
val i = (1 to 8).toIterator val oneToThree = i.takeWhile(_ val i = (1 to 8).iterator i: Iterator[In
我看到它们(where 和 takeWhile)具有相同的功能..否则我可能会在这里漏掉一些东西! 最佳答案 documentation for Iterable.where说: Returns a
isqrt :: Integer -> Integer isqrt = floor . sqrt . fromIntegral primes :: [Integer] primes = sieve [
Javadoc指出 This is a short-circuiting stateful intermediate operation. 有状态的定义来自 Javadoc : Stateful op
我是一名优秀的程序员,十分优秀!