当前位置: 首页 > 编程笔记 >

Haskell语言有状态透镜

何志业
2023-03-14
本文向大家介绍Haskell语言有状态透镜,包括了Haskell语言有状态透镜的使用技巧和注意事项,需要的朋友参考一下

示例

镜头运算符具有在有状态上下文中运行的有用变体。他们通过替换获得~与=在运营商的名称。

(+~) :: Num a => ASetter s t a a -> a -> s -> t
(+=) :: (MonadState s m, Num a) => ASetter' s a -> a -> m ()

注意:有状态变体不应更改类型,因此它们具有Lens'或Simple Lens'签名。

摆脱&束缚

如果需要将具有镜头功能的操作链接起来,通常看起来像这样:

change :: A -> A
change a = a & lensA %~ operationA
             & lensB %~ operationB
             & lensC %~ operationC

这项工作得益于的关联性&。不过,有状态版本更为清晰。

change a = flip execState a $ do
    lensA %= operationA
    lensB %= operationB
    lensC %= operationC

如果lensX是的话id,当然只需将其抬起即可直接执行整个操作modify。

具有结构化状态的命令式代码

假设此示例状态:

data Point = Point { _x :: Float, _y :: Float }
data Entity = Entity { _position :: Point, _direction :: Float }
data World = World { _entities :: [Entity] }

makeLenses ''Point
makeLenses ''Entity
makeLenses ''World

我们可以编写类似于经典命令式语言的代码,同时仍然允许我们使用Haskell的优点:

updateWorld :: MonadState World m => m ()
updateWorld = do
    -- move the first entity
    entities . ix 0 . position . x += 1

    -- do some operation on all of them
    entities . traversed . position %= \p -> p `pointAdd` ...

    -- or only on a subset
    entities . traversed . filtered (\e -> e ^.position.x> 100) %= ...
           

 类似资料:
  • 主要内容:锁住共享资源有并发,就有资源竞争,如果两个或者多个 goroutine 在没有相互同步的情况下,访问某个共享的资源,比如同时对该资源进行读写时,就会处于相互竞争的状态,这就是并发中的资源竞争。 并发本身并不复杂,但是因为有了资源竞争的问题,就使得我们开发出好的并发程序变得复杂起来,因为会引起很多莫名其妙的问题。 下面的代码中就会出现竞争状态: 这是一个资源竞争的例子,大家可以将程序多运行几次,会发现结果可能是

  • 本书与《深入淺出 Hello World》有着类似的心路历程,旨在以实验的方式去探究类似 Hello World 这样的小程序在开发与执行过程中的微妙变化,一层层揭开 C 语言程序开发过程的神秘面纱,透视背后的秘密,不断享受醍醐灌顶的美妙。 背景 笔者 2007 年开始系统地学习 Shell 编程,并在兰大开源社区写了序列文章。 在编写《Shell 编程范例》文章的《进程操作》一章时,为了全面了解

  • 在“新”Android4.3版中有一个新功能。屏幕顶部的状态栏在launcher中是透明的(我在Galaxy S3上使用三星TouchWiz),在其他一些应用中也是透明的(看起来有点像iOS 7风格)。你能告诉我如何在我自己的应用程序(Eclipse、Java)中使状态栏透明(或彩色)吗?

  • 本文向大家介绍动态语言、动态类型语言、静态类型语言、强类型语言、弱类型语言介绍,包括了动态语言、动态类型语言、静态类型语言、强类型语言、弱类型语言介绍的使用技巧和注意事项,需要的朋友参考一下 关于如题这几个概念,大部分人应该比较熟悉,但是我昏了好久,所以写下来加深印象。 1. 动态语言 又叫动态编程语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化。比如

  • 在动态类型语言去掉类型二字,就成了动态语言,比方说不少地方都说python是动态语言,其实只是它的动态性比较多一些而已,很多所谓的静态语言也有动态性,只是没有那么明显,因此动态语言是一个很含糊的词,一般而言就是随主流的认识,比如python,ruby是动态语言,C,java是静态语言等 动态性不适合修饰语言,适合修饰一些语法特性,简单的说,静态就是编译期可以决定的一些事情,而动态就是运行期才能决定

  • 有人知道如何使用React Native使Android状态栏透明吗? 不透明,透明。 我也在使用react导航。