- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在试验严格和懒惰的ST
monads,我并不清楚每个人的懒惰程度。
例如,使用惰性 Control.Monad.State.Lazy
monad 我们可以写:
main = print $ (flip evalState) "a" $ do
forever $ put "b"
put "c"
get
"c"
.双重的,严格的
Control.Monad.State.Strict
的代码相同变体将运行
put "b"
永远,并挂起。
ST
具有相同的对偶性。单子(monad)。也就是说,给定代码:
main = print $ S.runST $ do
r <- newSTRef "a"
forever $ writeSTRef r "b"
writeSTRef r "c"
readSTRef r
Control.Monad.ST.Lazy
应该输出
"c"
, 而
Control.Monad.ST.Strict
应该挂。但是,它们都无限循环。我认为这是有正当理由的,例如:向后阅读,引用
r
在最后一个
writeSTRef
的时间尚未分配叫做。但不知何故,感觉我们可以做得更好。
最佳答案
How lazy is the lazy
Control.Monad.ST.Lazy
monad?
Data.STRef.Lazy
不是。
ST.Lazy
懒惰
import qualified Control.Monad.ST as S
import qualified Control.Monad.ST.Lazy as L
squared :: Monad m => m [Integer]
squared = mapM (return . (^2)) [1..]
ok, oops :: [Integer]
ok = L.runST squared
oops = S.runST squared
ok
和
oops
应该做同样的事情,我们只能得到
ok
的元素.如果我们尝试使用
head oops
,我们会失败。然而,关于
ok
,我们可以取任意多个元素。
ok, oops :: [Integer]
ok' = map (^2) [1..]
oops' = let x = map (^2) [1..] in force x -- Control.DeepSeq.force
This module presents an identical interface to Control.Monad.ST, except that the monad delays evaluation of state operations until a value depending on them is required.
readSTRef
呢? ?
main = print $ L.runST $ do
forever $ return ()
r <- newSTRef "a"
readSTRef r
return
在最后 …
main = print $ L.runST $ do
forever $ return ()
r <- newSTRef "a"
readSTRef r
return "a"
newSTRef
中有一些严格的东西或
readSTRef
.让我们看看他们的
implementation :
import qualified Data.STRef as ST
newSTRef = strictToLazyST . ST.newSTRef
readSTRef = strictToLazyST . ST.readSTRef
writeSTRef r a = strictToLazyST (ST.writeSTRef r a)
Data.STRef.Lazy
实际上是通过
Data.STRef
实现的, 这意味着
Control.Monad.ST.Strict
.
strictToLazyST
只隐藏这个细节:
strictToLazyST :: ST.ST s a -> ST s a
strictToLazyST m = ST $ \s ->Convert a strict ST computation into a lazy one. The strict state thread passed to
strictToLazyST
is not performed until the result of the lazy state thread it returns is demanded.
main
, 我们要 print
懒人给出的值ST
计算 ST
计算值由惰性 readSTRef
给出readSTRef
实际上是作为严格的 readSTRef
的惰性包装器实现的。 readSTRef
评估状态,就好像它是一个严格的 forever $ return ()
的严格评价咬我们ST.Lazy
够懒。
这是Data.STRef.Lazy
这太严格了。 只要
Data.STRef.Lazy
基于
strictToLazyST
,这种行为会持续下去。
关于Haskell:懒惰的 `Control.Monad.ST.Lazy` monad 有多懒惰?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24072934/
嘿伙计们,我正在尝试删除最后一个 _1.jpg 如果它存在于我的表达中,但我遇到了一些麻烦 场景如下。 image_name_1.jpg(应该是image_name.jpg) image_name_1
对lazy="extra"究竟能做什么,有没有很好的解释? 我看过的所有帖子都只是重复了一个事实,即它会引用 MyObject.ItsCollection.Count进入 select count(*
我只在需要时加载 Google map 。在我重构代码之前,它的工作原理如下: function initialize_map_brand() { (...) } jQuery(document)
我编写了一个生成子集子集的函数。当我按以下方式使用子集[1..]时,它导致堆栈溢出。对于“正常”(非惰性)语言来说,这是“正常”行为。现在,我想改进我的懒惰功能。 附注我不理解懒惰(我试图理解它)所以
我正在尝试伪造对带有 out 参数的方法的调用,其中包含带有一些基本逻辑的 ReturnsLazily。理想情况下,我可以根据 ReturnsLazily 通过 AssignsOutAndRefPar
以下量词在场景、速度等方面有何不同。 ?、?? 和 ?+ 都匹配 0 或 1 次。 *, *?和*+` 都匹配0 次或更多次。 +、+? 和 ++ 都匹配1 次或多次。 ?、* 和 + 是贪心。 ??
我有以下代码: @Entity public class Foo { @OneToMany(mappedBy = "Foo", fetch = FetchType.LAZY) @Cascade
你如何使用正则表达式在 Stata 中实现非贪婪匹配?或者Stata甚至有这种能力? 我想提取出现在主题标签“#”和句点“.”之间的所有文本。 示例代码: clear set obs 3 genera
我有以下 Haskell 程序用于计算整数字符串的最大和子串: {-# LANGUAGE BangPatterns #-} {-# OPTIONS_GHC -O2 #-} import Data.Fu
我想记住如何在懒球拍中进行动态编程。解决了Euler项目的问题之一后,我开始感到奇怪: 从下面的三角形的顶部开始并移至相邻的三角形 在下面的行中,数字从上到下的最大值为23。 3 7 4
我是 Hibernate 对象持久化方面的新手。我正在读一本书,试图了解惰性设置为 false、急切和立即获取之间的区别,但我没有看到任何区别。有什么帮助吗?? 提前致谢! 最佳答案 立即获取和急切获
我正在使用Hibernate做映射。我的一个类有一组long。我想在获取此对象时将 lazy 设置为 true。如果我获取一个对象并在一段时间后使用其中的集合,会导致问题吗? 最佳答案 lazy 属性
所以我知道按需求调用只是按名称调用的内存版本。在 Martin Odersky 在 Coursera 上的 FP 类(class)的第 7.3 课(惰性评估)中,他提到如果使用按名称调用来实现 Str
语境 以下代码无限循环: (defn ex13 [] (take 5 (run* [x] (listo (lcons `a (lcons `b (lcons `c x
我刚开始学习 Haskell。下面是一些用命令式编写的代码,它实现了一个简单的服务器——它打印出 HTTP 请求 header 。除了我需要在 Haskell 中重新考虑它以使用惰性列表和高阶函数这一
据我了解,Racket 有严格的即急切的评估,但可以选择惰性评估。我对函数式语言所做的有限阅读表明,惰性求值语言通常可以更具表现力,因此为所有 Racket 程序选择惰性求值选项是否存在任何“技术”缺
这个问题在这里已经有了答案: Reference - What does this regex mean? (1 个回答) 关闭 1 年前。 最近,在网络*的某个地方,我找到了正则表达式的引用,它描
有谁知道关于以下主题的“现有技术”: 我有需要一些时间才能加载的数据。它们是各种股票的历史水平。 我想以某种方式预加载它们,以避免使用我的应用程序时出现延迟 但是,在开始时将它们分块预加载会使我的应用
我想知道的是:如果有一个基类,那么在 C++ 中每个*其他类继承自是不是一个好主意。基本上,它与 C# 的 Object 具有相同的接口(interface),即: *直接接口(interface)和
我正在尝试实现自己的 boolean 类,但无法为 && 复制 native 语义。以下人为设计的代码演示了该问题: #include > class MyBool { pub
我是一名优秀的程序员,十分优秀!