标签: lazy-evaluation

C#如何使用正则表达式分割(A:B = C)*?

这应该是一个非常简单的问题,但我似乎无法找到正确的解决方案.格式中有一个字符串:

A:B=C;D:E=F;G:E=H;...
Run Code Online (Sandbox Code Playgroud)

而A,B和C是字母数字(并且可以更低,也可以是大写).A和B的长度为1+,C可以为空.

我想我必须使用类似的东西

((?<A>.+):(?<B>.+)=(?<C>.*);)*
Run Code Online (Sandbox Code Playgroud)

但我不知道如何以懒惰的方式使它匹配.我也不确定如何获得相应匹配的结果,所以我很感激一些代码示例.

如果你能给我一个提示,我会很高兴的.

c# regex lazy-evaluation

1
推荐指数
1
解决办法
883
查看次数

C#单元测试:如何将Lazy <T> .ValueCreated设置为false?

基本上,我有一个单元测试,可以获得一个类的单例实例.我的一些测试要求我模拟这个单例,所以当我做Foo.Instance我得到一个不同类型的实例.

问题是我的检查单独传递,但整体失败,因为一个测试正在干扰另一个测试.

我尝试在我设置的TestCleanup中执行:Foo_Accessor._instance = null;但这不起作用.我真正需要的是Foo_Accessor._instance.IsValueCreated = false;(_instance是一个懒惰的人).

有没有办法取消我没想到的Lazy对象?

c# singleton unit-testing lazy-evaluation

1
推荐指数
1
解决办法
993
查看次数

为什么这个功能没有懒惰?

我有两个类似于filter和的功能takeWhile.

filterAcc, takeWhileAcc :: ([a] -> Bool) -> [a] -> [a]
filterAcc p xs = go xs []
    where go [] acc     = acc
          go (x:xs) acc
            | p (x:acc) = go xs (x:acc)
            | otherwise = go xs acc

takeWhileAcc p xs = go xs []
    where go [] acc     = acc
          go (x:xs) acc
            | p (x:acc) = go xs (x:acc)
            | otherwise = acc
Run Code Online (Sandbox Code Playgroud)

他们都采取谓词和列表,以及他们从正规的不同filter,并takeWhile在该谓词采取累积结果作为输入.

我的问题是,虽然filter even [1..] …

haskell lazy-evaluation

1
推荐指数
1
解决办法
174
查看次数

重写成员和惰性值

我找到了有关如何通过使用lazy val将重写的成员值传播给超类构造函数的解释。不幸的是,本文没有解释为什么这样做。

我知道不能将非惰性值分配两次,因此,在超级构造函数中没有可用的值,因为必须跳过超类构造函数中的值分配,才能不将变量锁定为另一个值。但是,如何在超级构造函数中执行的println语句(即在分配新的惰性值之前)已经知道此新值?我是否对执行顺序感到困惑?还是println以某种方式仅在构造对象之后才评估其参数?

constructor scala lazy-evaluation

1
推荐指数
1
解决办法
1187
查看次数

foldr没有以无限列表返回

我已经阅读了https://www.haskell.org/haskellwiki/Foldl_as_foldr和其他一些关于foldl和foldr之间区别的博客文章.现在我正在尝试将斐波那契序列作为带有折叠器的无限列表编写,我想出了以下解决方案:

fibs2 :: [Integer]
fibs2 = foldr buildFibs [] [1..]
  where
    buildFibs :: Integer -> [Integer] -> [Integer]
    buildFibs _ [] = [0]
    buildFibs _ [0] = [1,0]
    buildFibs _ l@(x:s:z) = (x + s):l
Run Code Online (Sandbox Code Playgroud)

但是当我这样做时take 3 fibs2,函数不会返回.我认为折叠是身体递归允许你在这些类型的情况下使用无限列表.为什么这不适合我的解决方案?

recursion haskell lazy-evaluation

1
推荐指数
1
解决办法
105
查看次数

Haskell:替换monad变换器堆栈中的mapM以实现惰性求值(没有空间泄漏)

已经讨论过,mapM这里本来就不是懒惰的,例如这里这里.现在我正在努力解决这个问题的变化,其中mapM问题是在monad变换器堆栈内部.

这是一个函数,它取自我在gist.github.com上使用的LevelDB的具体,工作(但是空间泄漏)的例子:

-- read keys [1..n] from db at DirName and check that the values are correct
doRead :: FilePath -> Int -> IO ()
doRead dirName n = do
    success <- runResourceT $ do
        db <- open dirName defaultOptions{ cacheSize= 2048 }
        let check' = check db def in        -- is an Int -> ResourceT IO Bool
            and <$> mapM check' [1..n]      -- space leak !!!
    putStrLn $ if …
Run Code Online (Sandbox Code Playgroud)

monads haskell lazy-evaluation monad-transformers

1
推荐指数
1
解决办法
183
查看次数

懒惰评估如何运作?

我是函数式编程的新手,我想要了解懒惰的评估是如何工作的.我有以下功能:

nats = 0:(map (+1) nats)
test = foldr (\x y-> if x > 2 then 0 else x+y) 10 nats
Run Code Online (Sandbox Code Playgroud)

而据我所知,第一个得到所有自然数的列表,直到它耗尽内存(但从来没有真正发生过,我理解),第二个应该做的正是什么?测试有一个lambda演算函数,它得到一个x和y,如果x> 2和x + y,则返回2,但这是否意味着它将返回0,因为x = 10?我有点困惑.在那种情况下,nat真的需要吗?

编辑:测试返回3,但现在我真的很困惑,因为我不明白如何.

如果我犯了一些菜鸟错误,谢谢,抱歉,但我不明白这是怎么回事.

haskell functional-programming lazy-evaluation

1
推荐指数
1
解决办法
149
查看次数

Swift 3中的延迟属性与函数

    struct Person
    {
        var personName:String?
        init(name:String) {
              personName=name
        }

    lazy var greetLazy:String =
    {
            return "Hello \(self.personName!)"
    }()

    func greetFunc()->String
    {
        return "Hello \(self.personName!)"
    }
}

var person:Person=Person(name:"")
print(person.greetLazy)
print(person.greetFunc())
Run Code Online (Sandbox Code Playgroud)

我创造了两件事,即一个懒惰的属性和一个做同样事情的功能.现在它说greetLazy的值只会在第一次访问时计算出来,所以当我使用person.greetLazy访问它时,它会打印到控制台,这就是懒惰应该是什么意思.

我的问题是在函数的情况下,只有在我访问函数时才会返回值.它不会预先计算它.那么在这种情况下两者之间会有什么区别呢?

function lazy-evaluation swift

1
推荐指数
1
解决办法
507
查看次数

Haskell Streams(Comonadic):无限?

我已经看到使用流作为comonad的默认示例,但我无法确定它们是如何无限的,但不是.

假设我们有数据构造函数(从这里)

data Stream a = a :> Stream a
Run Code Online (Sandbox Code Playgroud)

我们如何最终完成一个流?我们在最后写了一个未定义的吗?我知道这种语言是懒惰的,但某些地方必须削减,对吧?我错了吗?

haskell stream infinite lazy-evaluation

1
推荐指数
1
解决办法
196
查看次数

Clojure:减少大型懒惰收集会占用内存

我是Clojure的新手.我有以下代码,它创建了一个无限懒惰的数字序列:

(defn generator [seed factor]
  (drop 1 (reductions 
            (fn [acc _] (mod (* acc factor) 2147483647))
            seed 
            ; using dummy infinite seq to keep the reductions going
            (repeat 1))))
Run Code Online (Sandbox Code Playgroud)

序列中的每个数字都取决于先前的计算.我正在使用,reductions因为我需要所有中间结果.

然后我实例化两个生成器,如下所示:

(def gen-a (generator 59 16807))
(def gen-b (generator 393 48271))
Run Code Online (Sandbox Code Playgroud)

然后我想比较n这些序列的连续结果,对于大n,并返回它们相等的次数.

起初我做了类似的事情:

(defn run []
  (->> (interleave gen-a gen-b)
       (partition 2)
       (take 40000000)
       (filter #(apply = %))
       (count)))
Run Code Online (Sandbox Code Playgroud)

这花了太长时间,我看到该程序的内存使用量飙升至约4GB.有些printlns我看到它经过大约1000万次迭代后变得非常慢,所以我想可能count需要将整个序列存储在内存中,所以我把它更改为使用reduce:

(defn run-2 []
  (reduce
    (fn [acc [a b]]
      (if (= …
Run Code Online (Sandbox Code Playgroud)

memory performance clojure sequence lazy-evaluation

1
推荐指数
1
解决办法
218
查看次数