- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在读这篇文章article用于理解镜头。我知道这不同于Edward Knett 的镜头包,但尽管如此,它对于基础知识很有用。
所以,镜头的定义如下:
type Lens a b = (a -> b, b -> a -> a)
有人提到镜头形成一个类别,我一直在尝试为 Category
类型类创建实例。首先,我编写函数的类型定义:
(.) :: Lens y z -> Lens x y -> Lens x z
id :: Lens x x
此后,我就盯着它看一整天。到底是什么编写其定义的思维过程?
最佳答案
我找到了这个article (约瑟夫·亚伯拉罕森(Joseph Abrahamson)从头开始的 fpcomplete 镜头)要非常好,它从与您开始使用的镜头相同的表示开始,为其定义构图,并继续沿着与 lens 更相似的表示的路径前进。
编辑:我发现在做这种事情时类型孔非常好:
(<.>):: Lens y z -> Lens x y -> Lens x z
(getA,setA) <.> (getB,setB) = (_,_)
现在我们有 2 个孔,元组中的第一个表示(输出已清理):
Found hole ‘_’ with type: x -> z
...
Relevant bindings include
setB :: y -> x -> x
getB :: x -> y
setA :: z -> y -> y
getA :: y -> z
(<.>) :: Lens y z -> Lens x y -> Lens x z
仔细观察绑定(bind),我们已经拥有了我们需要的东西! getB::x -> y
和 getA::y -> z
以及函数组合 (.)::(b -> c) -> ( a -> b) -> a -> c
所以我们很高兴插入这个:
(<.>):: Lens y z -> Lens x y -> Lens x z
(getA,setA) <.> (getB,setB) = (getA . getB, _)
然后继续第二种类型的洞,它说:
Found hole ‘_’ with type: z -> x -> x
Relevant bindings include
setB :: y -> x -> x
getB :: x -> y
setA :: z -> y -> y
getA :: y -> z
我们最相似的东西是 setA::z -> y -> y
,我们首先插入一个 lambda,捕获参数:
(getA,setA) <.> (getB,setB) = (getA . getB, \z x -> _)
将您的类型孔更改为:
Found hole ‘_’ with type: x
Relevant bindings include
x :: x
z :: z
setB :: y -> x -> x
getB :: x -> y
setA :: z -> y -> y
getA :: y -> z
我们可以插入x
,它会进行类型检查,但不会给我们想要的东西(设置时什么也不会发生)。唯一可以为我们提供 x
的其他绑定(bind)是 setB
,因此我们插入:
(getA,setA) <.> (getB,setB) = (getA . getB, \z x -> setB _ _)
我们的第一种类型的洞说:
Found hole ‘_’ with type: y
Relevant bindings include
x :: x
z :: z
setB :: y -> x -> x
getB :: x -> y
setA :: z -> y -> y
getA :: y -> z
所以我们需要一个 y,查看范围内的内容,如果我们给它一个 x
,getB
可以给我们一个 y
,我们碰巧有,但这会导致我们的镜头再次无用。另一种方法是使用 setA
:
(getA,setA) <.> (getB,setB) = (getA . getB, \z x -> setB (setA _ _) _)
(从现在开始加快速度)同样,第一个洞想要 z
类型的东西,他恰好将其作为我们的 lambda 的参数:
(getA,setA) <.> (getB,setB) = (getA . getB, \z x -> setB (setA z _) _)
要填充 y
类型的第一个类型洞,我们可以使用 getB::x -> y
为其提供 lambda 的参数:
(getA,setA) <.> (getB,setB) = (getA . getB, \z x -> setB (setA z (getB x)) _)
这给我们留下了一个剩余的类型孔,可以轻松地用 x
替换它,从而得到最终的定义:
(<.>):: Lens y z -> Lens x y -> Lens x z
(getA,setA) <.> (getB,setB) = (getA . getB, \z x -> setB (setA z (getB x)) x)
您可以尝试为自己定义id
,如有必要,可以使用类型孔和hoogle
关于haskell - 为自定义镜头编写类别实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22404939/
使用镜头更新集合中元素的最佳方法是什么?例如: case class Ingredient(name: String, quantity: Int) case class Recipe(val ing
有没有办法在最后一次使用 hakell 镜头之前获取元素?例如,我有这样一个结构: pp = (1,2,3,4) 我想做类似 pp ^. _almostLast 的事情并获得 3 .我不能使用 _3
我不断深入研究 Kmett 的镜头;今天我试图编写一些自定义遍历,到目前为止,我已经成功地通过组合现有的遍历来创建新的遍历,但我正在做一些更复杂的事情并陷入困境。 我正在编写一个文本编辑器,我只是添加
我想知道 Haskell 中是否有身份镜头。一个镜头identity这样如果我有一个类型 data MyType = MyType { _myField :: Int } ,那我可以做myType ^
我想写: minimum $ map _x elems 使用镜头。我想用minimumOf镜头,但我无法从它的类型中弄清楚如何使用它。 我正在寻找类似的东西 elems ^.. minimumOf x
我有兴趣为我的 monad 转换器堆栈获得缩放功能,该功能定义如下: newtype Awesome a = Awesome (StateT AwesomeState (ExceptT B.ByteS
像 Maybe (Lens' a b) 这样的类型不起作用,因为 Lens' 在引擎盖下是 Rank-2 类型,如果没有 -XImpredicativeTypes,则无法将其包装在类型构造函数中扩展名
有一个 Scalaz map 镜头的例子 here :丹伯顿称之为 containsKey ,它的灵感来自 Edward Kmett 的演讲。还有一个叫mapVPLens的东西在 Scalaz 7 中
我有那些镜头: getB :: Lens' A (Maybe B) getC :: Prism' B C 如何从 A 中提取 Maybe C?我能找到的最好的: case A ^. getB of
如果您浏览有关镜头的Lens条目,Lens Github的存储库,甚至是有关Lens的Google,您会发现很多局部参考,例如入门教程/视频,示例,概述等。由于我已经了解大多数基本知识,因此我正在寻找
我想将谷歌镜头服务集成到我的 android 应用程序中,但我没有得到任何直接的方法来实现它,也没有任何库或任何谷歌 API。 任何人都可以帮助我在我的 android 应用程序中实现 google
如果我有一个用于嵌套记录的镜头,其中每个镜头都返回一个也许,我怎样才能让它们组合,以便如果“遍历”中有任何内容返回Nothing 最终结果是Nothing? data Client = Client
Noobie 到 Ramda。所以,我面临着一些深度状态更新问题。有人推荐了 Ramda。现在我需要一些帮助。这是我的 react 状态 steps: { currentStep: 1
社区,你好👋。我遇到了一个小问题。我有这样一个数据结构 { "type": "Shoes", "gender": "female", "userInfo": {
谁能解释*什么是 OCaml 中的镜头? 我试着用谷歌搜索,但几乎所有这些都在 Haskell 的世界里。 只是希望在 OCaml 的世界中对它进行一些简单的演示,比如它是什么,它可以用来做什么等等。
我有以下代码。我希望能够在给定游戏状态时修改活跃玩家的生活。我想出了一个 activePlayer镜头,但是当我尝试将它与 -= 结合使用时运算符(operator)我收到以下错误: > over (
我一直在阅读this article并且在他们的一节中指出: Lenses compose backwards. Can't we make (.) behave like functions? Yo
我喜欢在 uiwebview 上禁用缩放/镜头。但是,我不希望任何用户选择在此过程中被禁用,即我不能在我的 css 中使用以下内容。 -webkit-user-select:none 最佳答案 如果您
至少有三个流行的库用于访问和操作记录字段。我所知道的有:数据访问器、fclabels 和镜头。 我个人从数据访问器开始,现在正在使用它们。然而,最近在 haskell-cafe 上,有人认为 fcla
我正在尝试通过在 Haskell 中实现镜头来了解镜头。我已经实现了view组合器如下: {-# LANGUAGE RankNTypes #-} import Control.Applicative
我是一名优秀的程序员,十分优秀!