我真的查遍了所有地方,但没有找到我的问题的答案:
普遍问题:
formals()在不启动 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) 如https://stackblitz.com/edit/angular-qbbhgp所示,我试图实现一个非常简单的路由,其中涉及模块的延迟加载。当我点击“链接”时,它似乎不起作用。我预计会看到“学生页面”一词出现,但它没有发生。
请注意,我希望解决方案涉及使用 import api (延迟加载模块的较新语法)
所以我的问题是关于 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 声明中。如果情况并非如此,请告诉我。
我无法理解以下原因:
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?
我以为我了解 Haskell 中折叠性能的基础知识,如Haskell Wiki和许多其他地方的foldr、foldl、foldl'中所述。特别是,我了解到对于累积函数,应该使用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) 我有一个共同的模式:
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)
会解决问题吗?因为惰性对象将被创建,但没有任何东西可以查询值本身。
那会可靠地工作吗?
我将找到解决这个问题的方法:
将给定列表拆分为具有给定子列表长度和跳过长度的子列表,例如:
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详细信息是:
这是我的解决方案:
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)
但这个解决方案并不懒惰,例如 …
这段代码:
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) 抱歉,如果这是一个常见问题,我找不到类似的问题,但我可能太缺乏经验,不知道正确的词汇。
以下是 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) 如果变体仅在需要时..._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 ×10
haskell ×5
evaluation ×2
fold ×2
list ×2
angular ×1
arguments ×1
f# ×1
ghc ×1
ghci ×1
load ×1
memory ×1
performance ×1
php ×1
r ×1
recursion ×1
routes ×1
rust ×1
rust-clippy ×1
strictness ×1