- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给出一般的Getter
类型
type Getter s a = forall f. (Contravariant f, Functor f) => (a -> f a) -> s -> f s
最佳答案
在类型Getter s a
中,类型s
表示以某种方式“包含”类型为a
的值的“对象”,getter可以以某种方式“提取”该值。
如果要实现一对吸气剂,则s = (x, y)
和a
可能是x
或y
,这取决于要提取的元素。为了清楚起见,我们要提取第一个元素。然后a = x
。
好的,因此您的函数应如下所示:
firstElementGetter :: Getter (x, y) x
Getter
的定义,则会得到:
firstElementGetter :: (blah-blah) => (x -> f x) -> (x, y) -> f (x, y)
firstElementGetter h (x, y) = ...
h
中“包装”一个
x
的函数
f
,以及(2)一个元组
(x, y)
;它需要返回包装在函子
(x, y)
中的元组
f
。让我们看看是否可以做到这一点。
h
,它带有类型为
x
的参数。方便地,我们也有这种类型的
x
。让我们应用它:
h x
。其结果的类型为
f x
。我们如何将其转换为
f (x, y)
?
Functor
的本质是您可以在其上进行映射。那么我们可以在
f x
上映射什么功能以获得
f (x, y)
?这样的功能显然需要具有
x -> (x, y)
类型-瞧!我们拥有构造此功能的所有部分!我们可以采用现有的
y
并将其重新组合为元组:
\xx -> (xx, y)
。
firstElementGetter :: (blah-blah) => (x -> f x) -> (x, y) -> f (x, y)
firstElementGetter h (x, y) = fmap (\xx -> (xx, y)) (h x)
f
和正确的包装函数
h
来使他们做不同的事情。
data Const a b = Const a
instance Functor (Const a) where
fmap f (Const a) = Const a
b
的。实际上并没有“包装”它的值,并且
fmap
实现也没有涉及它。您可能会说这是“伪”函子。我们将利用它来发挥我们的优势!
h
,我们将选择
Const
。它适合该类型,因为任何
Const :: x -> Const x foo
的
foo
都与
x -> Const x x
兼容,而
x -> f x
与
f = Const x
匹配所需的类型
h = Const
。我知道,这有点令人难以置信,但请多多包涵。
h x
,则我们的吸气剂将忠实地调用
Const x
,这将返回
fmap
,该吸气剂将返回
fmap
,但是由于我们的
fmap
定义将忽略其第一个参数,因此
Const x
,然后吸气剂将返回它。现在,我们要做的就是拆开包装,我们完成了!
getFirst :: (x, y) -> x
getFirst pair =
let (Const x) = firstElementGetter Const pair
in x
Contravariant
部分是一个聪明的类型级别的黑客。请参见,当函子
f
不仅是
Functor
,而且是
Contravariant
时,它必须具有上述
Const
类型的形状-即它不能在内部“包装”其类型参数的值。
Functor
视为“产生”(或“包含”)值的事物,而将
Contravariant
视为“消耗”值的事物。如果必须同时使用“包装器”类型,则实现它的唯一方法是仅假装“使用”或“产生”值,而在后台忽略它们。我知道这不是一个很明确的解释,但我无法做得更好。您将看到尝试实现这样的类型。
Getter
这个怪异的约束,就像确保它唯一可以做的就是“获取”值,而不是“设置”或“转换”该值一样。
s -> a
。
(a -> x) -> s -> x
是一种不太简单的实现-连续传递样式,但与上一个等效。
(a -> Const x a) -> s -> Const x s
-我只是用不同的
a
用
Const x foo
替换了两个
foo
,但这仍然与前一个等效。
关于haskell - 如何为特定类型实现类似Getter的镜头?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57436243/
使用镜头更新集合中元素的最佳方法是什么?例如: 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
我是一名优秀的程序员,十分优秀!