- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
爱生提供 FromJSON1
和 ToJSON1
类型类。这些类似于 Eq1
和 Show1
Data.Functor.Classes
中定义的类模块。
我对 Eq1
的理解和 Show1
类是需要它们能够表达对转换器参数的约束,而不使用像 FlexibleContexts
这样的扩展。和 UndecidableInstances
.Data.Functor.Classes
中文档中的示例模块如下:
假设我们有一个充当转换器的数据类型:T
.例如,让它与 IdentityT
同构。 :
data T f a = T (f a)
T
如下:
T :: (* -> *) -> * -> *
Eq1
f
的实例,可以在写
Eq1
的时候使用
T f
的实例:
instance Eq1 f => Eq1 (T f) where
liftEq :: (a -> b -> Bool) -> T f a -> T f b -> Bool
liftEq eq (T fa1) (T fa2) = liftEq eq fa1 fa2
Eq1
f
的实例, 一个
Eq
a
的实例,以及
Eq1
T f
的实例以上是在范围内,我们可以很容易地写
Eq
T f a
的实例:
instance (Eq1 f, Eq a) => Eq (T f a) where
(==) :: T f a -> T f a -> Bool
(==) = eq1
eq1
的类型定义如下:
eq1 :: (Eq1 h, Eq a) => h a -> h a -> Bool
h
变成
T f
,所以
eq1
的类型可以认为如下:
eq1 :: Eq a => T f a -> T f a -> Bool
Eq1
,
Show1
等类是有意义的。似乎更容易编写
Eq
的实例,
Show
等用于变压器。
FromJSON1
的类型是什么?和
ToJSON1
用于Aeson?我很少有我想在 JSON 之间转换的转换器。
*
.我也使用像
Maybe
这样的类型用一种
* -> *
.
ToJSON
或
FromJSON
变压器的实例,例如
T
多于。什么是经常用于往返 JSON 的转换器?我错过了一些有用的变压器吗?
最佳答案
Eq1
提供了另一个您在说明中没有讨论过的特性:它允许您编写一个调用 (==)
的函数。在许多不同的类型上,不必提前知道您将在哪些类型上使用它。
我将举一个玩具示例;希望你能看穿这个例子的明显无用的原因 Eq1
给你一些有趣的力量。
想象一下,您想要创建一个在分支因子上参数化的树,因此您通过子容器对其进行参数化。所以值可能如下所示:
{-# LANGUAGE GADTs #-}
data Tree m a where
Branch :: Tree m (m a) -> Tree m a
Leaf :: a -> Tree m a
Tree Pair
, 三叉树与
Tree Triple
,手指树与
Tree TwoThree
, 和玫瑰树与
Tree []
, 其中
data Pair a = Pair a a
,
data Triple a = Triple a a a
, 和
data TwoThree a = Two a a | Three a a a
.现在我想写一个
Eq
例如这个。如果我们只依赖
Eq
约束,我们无法到达我们想去的地方。咱们试试吧:
instance Eq (Tree m a) where
Leaf a == Leaf a' = a == a'
Branch t == Branch t' = t == t'
_ == _ = False
a
和
a'
为了平等。所以添加
Eq a
上下文:
instance Eq a => Eq (Tree m a) where ...
m a
s 表示
Branch
中的平等案子。说得通。
instance (Eq a, Eq (m a)) => Eq (Tree m a) where ...
(==) :: Tree m a -> Tree m a -> Bool
递归调用
(==) :: Tree m (m a) -> Tree m (m a) -> Bool
在其
Branch
情况,因此必须提供上下文
(Eq (m a), Eq (m (m a)))
进行递归调用。好的,让我们将它添加到实例上下文中......
instance (Eq a, Eq (m a), Eq (m (m a))) => Eq (Tree m a) where ...
Eq b
, 那么我们有
Eq (m b)
, 对于所有
b
s 而不仅仅是特定的
a
被用作
Tree
的第二个参数。
instance (Eq a, (forall b. Eq b => Eq (m b))) => Eq (Tree m a) where ...
Eq1
给了我们:
instance Eq1 m => Eq1 (Tree m) where
liftEq (==) (Leaf a) (Leaf a') = a == a'
liftEq (==) (Branch t) (Branch t') = liftEq (liftEq (==)) t t'
liftEq (==) _ _ = False
instance (Eq1 m, Eq a) => Eq (Tree m a) where
(==) = eq1
Eq1 m
约束服务于我们之前要求的角色,即所有
(Eq a, Eq (m a), Eq (m (m a)), ...)
是可能的。
ToJSON1
和
FromJSON1
类起到类似的作用:它们给你一个单一的约束,你可以给它一个可能无限的
ToJSON
集合。和
FromJSON
约束,以便您可以选择
ToJSON
或
FromJSON
您需要以数据驱动的方式进行约束,并保证它是可用的。
关于haskell - aeson 中的 FromJSON1 和 ToJSON1 是做什么用的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49188247/
还是两者兼而有之? 最佳答案 因为扩展Object是不好的做法。 关于javascript - 为什么 MongoDB 不扩展对象以能够使用 a.tojson() 但仍然需要 tojson(a)?,我
我在另一个答案中看到,为了包含虚拟字段,您必须执行类似 https://groups.google.com/forum/?fromgroups#!topic/mongoose-orm/HjrPAP_W
我正在尝试使用 Gson 的 toJson API 将我的对象转换为 JSON 字符串。当我遇到支持相同的 2 个不同的 API 时。 As per Docs - public String toJs
我是knockout js的新手,我想将knockout.js与asp.net表单应用程序一起使用。我想使用 ajax 调用更新实体,如下所示 // Update product details
我是 JSON 的新手,因此我不确定 $.toJSON(params) 是什么意思。 请解释这是做什么的。 最佳答案 可能是这个jQuery plugin var myObj = {}; myObj.
让我们举个例子。我有一个 pojo 类,如下所示。 public class MyRecord{ private String name; private String id;
我有这样的代码: var test = new Date(2019, 03, 15, 13, 15, 0); console.log(test); //outputs Mon Apr 15 2019
我不确定为什么 this.model 在我的主干 View 中未定义。 这是我的脚本: var TheModel = Backbone.Model.extend({ defaults: {
我编写的组件将带有\n 换行符的文本转换为 html 段落 文本.js const Text = props => (( { props.paragraph.split('\n').ma
我需要从 JSON 响应中删除某些字段。为此,我使用了 toJSON() 方法。这是我的模态方法的代码。 User.methods.toJSON = function () { l
我在 asp.net mvc 页面上使用 knockoutjs。我正在使用 ajax 通过调用 ko.toJSON(viewModel) 将表单保存回服务器。然后使用 jQuery 将结果发布回服务器
我正在尝试使用 jQuery 和 Ajax,并且使用此方法。但我收到错误 $.toJSON is not a function in my firebug 。哪里有问题?我使用 jquery 1.3.
第一 quote来自 Redux 文档: It is highly recommended that you only put plain serializable objects,arrays, a
我创建了一个 .NET core 2.2 webapi,并使用 swagger/nswag 为我的 React/typescript 应用程序生成 API。当我尝试设置一个新对象时,我得到一个 ts(
例如,我位于澳大利亚,而 new Date() 为我提供澳大利亚的当前日期和时间2016 年 8 月 26 日星期五 09:16:16 GMT+1000(澳大利亚东部标准时间),如果我写 new Da
listData.forEach(function (row, index) { console.log(row); --> output JSON format { _id: 5
我对 knockout 计算的可观察值和 toJSON 函数有疑问。我创建了一个Fiddle Example 。在此示例中,我有一个模型: function VM() { this.Name =
我正在使用 knockout 映射插件从我的服务器映射对象。 我想重新发送这个对象,因此,我最终需要将这个对象转换为字符串。我在计算函数中使用了 knockout 函数 ko.toJSON,以便隐藏字
我正在尝试获取一些数据并使用 Backbone 显示它,但运气不佳 - 我没有收到任何错误,只是没有渲染(我使用 todos 示例作为指导构建了这个非常简单的应用程序) index.html:
我有一个 javascript 对象,如下所示: var Person = function() { var _name = ""; this.Age = 0; Object.
我是一名优秀的程序员,十分优秀!