- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在努力实现 UCT Haskell 中的算法,需要大量的数据处理。无需过多讨论,它是一种模拟算法,在每个“步骤”中,根据某些统计属性选择搜索树中的叶节点,在该叶处构造一个新的子节点,以及与该叶节点相对应的统计信息新叶子及其所有祖先都已更新。
考虑到所有这些杂耍,我还不够敏锐,无法弄清楚如何使整个搜索树成为一个很好的不可变数据结构Okasaki 。相反,我一直在尝试使用 ST
monad,创建由可变 STRef
组成的结构。一个人为的示例(与 UCT 无关):
import Control.Monad
import Control.Monad.ST
import Data.STRef
data STRefPair s a b = STRefPair { left :: STRef s a, right :: STRef s b }
mkStRefPair :: a -> b -> ST s (STRefPair s a b)
mkStRefPair a b = do
a' <- newSTRef a
b' <- newSTRef b
return $ STRefPair a' b'
derp :: (Num a, Num b) => STRefPair s a b -> ST s ()
derp p = do
modifySTRef (left p) (\x -> x + 1)
modifySTRef (right p) (\x -> x - 1)
herp :: (Num a, Num b) => (a, b)
herp = runST $ do
p <- mkStRefPair 0 0
replicateM_ 10 $ derp p
a <- readSTRef $ left p
b <- readSTRef $ right p
return (a, b)
main = print herp -- should print (10, -10)
显然,如果不使用 ST
,这个特定的示例会更容易编写,但希望我能清楚地知道我要做什么...如果我要将这种风格应用于我的 UCT用例,这是错误的吗?
有人问similar question几年前,但我认为我的问题有点不同......我在适当的时候使用 monad 来封装可变状态没有问题,但正是“适当的时候”子句让我着迷。我担心我过早地恢复到面向对象的思维方式,其中我有一堆带有 getter 和 setter 的对象。不完全是惯用的 Haskell...
另一方面,如果它是解决某些问题的合理编码风格,我想我的问题就变成:是否有任何众所周知的方法来保持此类代码的可读性和可维护性?我对所有显式读取和写入感到有点恶心,尤其是因为必须将 ST
monad 内基于 STRef
的结构转换为同构,但外部不可变的结构。
最佳答案
我不太使用ST,但有时它只是最好的解决方案。这可以在很多场景中实现:
当我使用 ST(和其他 monad)时,我尝试遵循以下一般准则:
STRef s (Map k [v])
之类的东西。 map 本身正在发生变化,但大部分繁重的工作都是纯粹完成的。IORef
替换为 STRef
并将 IO
替换为 ST
比编写手动编码的哈希表实现本来可以,而且可能更快。最后一点 - 如果您在显式读取和写入方面遇到问题,有 ways around it .
关于haskell - ST Monad == 代码味道?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7880555/
我有一个单独的 Customer 模型的 View ,该模型在构造时获取一个客户和客户集合。客户模型的需求是有道理的——它是客户的 View 。收藏的要求……我不确定那是不是一种气味,希望得到反馈!
我试图在不同的风格中使用相同的 activity 名称,并为每种风格安装正确的名称。 build.gradle : android { .... buildscript {
我是一名优秀的程序员,十分优秀!