标签: lazy-evaluation

R:如何评估函数的形式(参数)?

我真的查遍了所有地方,但没有找到我的问题的答案:

普遍问题:

  • 如何formals()在不启动 R 函数的情况下计算它的参数 ()?
  • 尽管 R 存在“惰性评估”,但您如何评估 R 中的整个环境?

我的问题 :

我想获取 R 中任何函数的参数的计算时间。例如,让我们考虑一个函数:

foo <- function(x, arg1 = 2, arg2 = arg3[1], arg3 = rnorm(10^6)) {
  rnorm(10^7) # whatever time-consuming computation here
  arg3^2
  message("Too bad you had to launch the whole function !")
}
Run Code Online (Sandbox Code Playgroud)

你会注意到困难:

  • 有些参数是必需的 ( x),有些则不需要。[结果:使用formals()不会返回 x 的未计算表达式!]
  • 一些参数是在另一个参数的函数中计算的,在它之后定义(arg2用 计算arg3

所需的输出:

> system.time(foo(x=1))
Too bad you had to launch the whole function !
       user      system      elapsed …
Run Code Online (Sandbox Code Playgroud)

arguments functional-programming r lazy-evaluation

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

Angular 8 - 模块延迟加载不起作用

如https://stackblitz.com/edit/angular-qbbhgp所示,我试图实现一个非常简单的路由,其中​​涉及模块的延迟加载。当我点击“链接”时,它似乎不起作用。我预计会看到“学生页面”一词出现,但它没有发生。

请注意,我希望解决方案涉及使用 import api (延迟加载模块的较新语法)

load routes lazy-evaluation angular

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

如果第一个参数的计算结果为 false,php 是否会计算 or 语句的第二个参数?

所以我的问题是关于 php 在 or 语句采用两个函数的情况下的行为。当第一个函数的计算结果为 true 时,第二个函数是否仍有可能被执行?

我希望下面的代码可以澄清我的意思:

$dbh->startTransaction();

$stmt = $dbh->prepare("DELETE FROM foo WHERE id=:id");

$stmt->bindParam(':id', $id, PDO::PARAM_INT);

if (!$stmt->execute() || !bar($id)) {
    $dbh->rollBack();
}

Run Code Online (Sandbox Code Playgroud)

我想确定的是,执行失败时永远不会调用bar()它。$stmt

我知道在某些语言中 or 语句会在!$stmt->execute()评估为 true 时返回 true,并且我可以确定bar()除非!$stmt->execute()评估为 false(意味着$stmt->execute()评估为 true 并且查询成功),否则不会调用该语句。

我在 php 中是否有这种确定性,或者服务器是否有可能同时或以相反的顺序进行评估$stmt->execute()bar($id)并以这种方式对我的数据库造成严重破坏?

我假设我也能够将我在这里得到的任何答案应用到 and 声明中。如果情况并非如此,请告诉我。

php evaluation lazy-evaluation

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

为什么折叠包含 undefined 的列表时 foldr 不返回 undefined?

我无法理解以下原因:

foldr (\x y -> x && y) True [False,undefined,True]
Run Code Online (Sandbox Code Playgroud)

不是给我一个undefined例外。

我的看法是,foldr比较True和列表的最后一个元素,即True,因此返回True并现在将其与undefined. 如果涉及undefined类型,Haskell 是否会忽略该操作?我知道输出是Trueif 在我们拥有的匿名函数x || y(&&),而不是,因为编译器会看到其中一个运算符已经设置为True,但是由于我们正在使用(&&)它,它必须检查两个值是否都已设置到True或其中一人False,对不对?

关于它为什么返回的任何线索False

evaluation haskell list lazy-evaluation fold

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

Haskell 的严格折叠真的使用线性空间吗?

我以为我了解 Haskell 中折叠性能的基础知识,如Haskell Wiki和许多其他地方的foldrfoldlfoldl'中所述。特别是,我了解到对于累积函数,应该使用foldl', 以避免空间泄漏,并且编写标准库函数以尊重这一点。所以我假设简单的累加器(如length)应用于简单的列表(如replicate n 1)应该在列表的长度上需要恒定的空间(或至少是次线性的)。我的直觉是,在足够简单的列表上,它们的行为大致类似于for命令式语言中的循环。

但是今天我发现这在实践中似乎并不成立。例如,length $ replicate n 1似乎在n. ghci

ghci> :set +s
ghci> length $ replicate (10^6) 1
1000000
(0.02 secs, 56,077,464 bytes)
ghci> length $ replicate (10^7) 1
10000000
(0.08 secs, 560,078,360 bytes)
ghci> length $ replicate (10^8) 1
100000000
(0.61 secs, 5,600,079,312 bytes)
ghci> length $ replicate (10^9) 1
1000000000
(5.88 …
Run Code Online (Sandbox Code Playgroud)

memory performance haskell lazy-evaluation fold

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

在 F# 属性中使用 lazy 会阻止代码在不应该被评估时被评估吗?

我有一个共同的模式:

type something =
    {
        ... a lot of stuff
    }

    member this.Description =
        "a string description of the content, can be long tables, etc"
Run Code Online (Sandbox Code Playgroud)

我希望仅在需要时才对 Description 属性进行评估;在许多情况下,它不会被使用,但它可以(主要是根据用户的要求)。

我注意到即使不需要此代码,它也会导致对 Description 进行评估。所以我把代码移到了一个函数:Describe() 就解决了这个问题。

当我重构时,我正在重新审视这个。虽然它在实践中不会让任何事情变得更好,但我想知道是否有类似的东西:

member this.Describe =
    (lazy "the long to build text output").Value
Run Code Online (Sandbox Code Playgroud)

会解决问题吗?因为惰性对象将被创建,但没有任何东西可以查询值本身。

那会可靠地工作吗?

f# lazy-evaluation

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

递归函数的惰性模式

我将找到解决这个问题的方法:

将给定列表拆分为具有给定子列表长度和跳过长度的子列表,例如:

groupEvery 3 1 [1..6] = [[1,2,3], [2,3,4], [3,4,5], [4,5,6]]
groupEvery 3 2 "abcdefghij" = [ "abc", "cde", "efg", "ghi", "ij"]
Run Code Online (Sandbox Code Playgroud)

参数groupEvery n p l详细信息是:

  • n 是子列表的长度:Int
  • f 是跳过的长度:Int
  • xs 是输入列表:[a]

这是我的解决方案:

groupEvery :: Int -> Int -> [a] -> [[a]] -> [[a]]
groupEvery n p xs acc
    | length xs <= n = acc ++ [xs]
    | otherwise = groupEvery n p dropped (acc++[segment])
        where
            dropped = drop p xs
            segment = take n xs
Run Code Online (Sandbox Code Playgroud)

但这个解决方案并不懒惰,例如 …

recursion haskell list lazy-evaluation

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

为什么连懒惰的褶子都如此渴望?

这段代码:

import Data.Foldable
import Debug.Trace

factors :: [Bool]
factors = [True, True, False, True, True, True, True, True]

andy :: Bool -> Bool -> Bool
andy False _ = False
andy True False = False
andy True True = True

tandy :: Bool -> Bool -> Bool 
tandy a b = let c = a `andy` b in trace (show a ++ " & " ++ show b ++ " = " ++ show c) c

wonder :: Bool
wonder …
Run Code Online (Sandbox Code Playgroud)

haskell lazy-evaluation

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

严格性以及如何告诉 GHC/GHCi 将值一劳永逸地存储在变量中

抱歉,如果这是一个常见问题,我找不到类似的问题,但我可能太缺乏经验,不知道正确的词汇。

以下是 GHCi 中基本问题的示例:

-- foo is something relatively expensive to compute, but it's lazy so it's instantaneous
*Main> foo = (foldl (++) [] (take 5000 $ repeat [10, 123, 323, 33, 11, 345, 23, 33, 23, 11, 987]))
(0.00 secs, 62,800 bytes)
-- bar is a result that uses foo, but it's also lazy so it's not computed yet
*Main> bar = last foo
(0.00 secs, 62,800 bytes)
-- Now let's use bar
*Main> bar
987
(1.82 secs, 11,343,660,560 …
Run Code Online (Sandbox Code Playgroud)

haskell lazy-evaluation ghc ghci strictness

2
推荐指数
2
解决办法
179
查看次数

在什么情况下 `..._or()` 比 `..._or_else(|| {})` 更好,为什么?

如果变体仅在需要时..._or_else()执行

// example
let value = option.unwrap_or_else(|| compute_value(argument));
// only executed if `option` is of enum variant Option::None
Run Code Online (Sandbox Code Playgroud)

那么有没有什么情况是..._or()有优势的呢?

我的理解是,如果里面的结果..._or_else()已经计算出来了,那么using..._or()就可以毫无缺陷地使用。但这种情况有什么好处吗?

..._or_else()我尝试过情况并发现了建议从 更改为 的Clippy 规则..._or(),但我很难理解该规则的原因:

为什么这样不好?

在某些情况下,使用即时求值会更短、更简单。

已知问题

Deref 和 Index 有可能产生副作用,但不建议这样做。急切地评估>它们可以改变程序的语义。

lazy-evaluation rust rust-clippy

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