Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >实现字典(Map,关联数组)的应用实例

实现字典(Map,关联数组)的应用实例
EN

Stack Overflow用户
提问于 2020-08-14 14:30:20
回答 1查看 385关注 0票数 5

为关联数组实现函式实例(本质上是映射操作)似乎很简单(例如,请参阅Functor定义1)。但是,没有定义Applicative实例。地图不是应用语有一个很好的理论原因吗?他们需要什么额外的约束才能成为应用程序?

1

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-17 16:13:14

正如人们在评论中指出的那样,您不能为Map实现一个有效的Map实例,因为您不能以一种守法的方式实现pure。由于标识规则pure id <*> v = vpure实现需要维护所有键,同时将映射与函数应用程序相交。对于部分映射,您不能这样做,因为通过参数化,您可能在一个映射或另一个映射中没有一个键来调用函数a -> b或参数a,从而在结果映射中生成bpure x需要像ZipList那样工作(它使用repeat),生成一个映射,将每个键映射到相同的值x,但这在Map中是不可能的,因为它是有限的。但是,使用允许无限映射的替代表示是可能的,例如基于函数和Eq的映射。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-- Represent a map by its lookup function.
newtype EqMap k v = EM (k -> Maybe v)

-- Empty: map every key to ‘Nothing’.
emEmpty :: EqMap k v
emEmpty = EM (const Nothing)

-- Singleton: map the given key to ‘Just’ the given value,
-- and all other keys to ‘Nothing’.
emSingleton :: (Eq k) => k -> v -> EqMap k v
emSingleton k v = EM (\ k' -> if k == k' then Just v else Nothing)

-- Insertion: add an entry that overrides any earlier entry
-- for the same key to return ‘Just’ a new value.
emInsert :: (Eq k) => k -> v -> EqMap k v -> EqMap k v
emInsert k v (EM e) = EM (\ k' -> if k == k' then Just v else e k')

-- Deletion: add an entry that overrides any earlier entry
-- for the same key to return ‘Nothing’.
emDelete :: (Eq k) => k -> EqMap k v -> EqMap k v
emDelete k (EM e) = EM (\ k' -> if k == k' then Nothing else e k')

emLookup :: EqMap k v -> k -> Maybe v
emLookup (EM e) = e

instance Functor (EqMap k) where

  -- Map over the return value of the lookup function.
  fmap :: (a -> b) -> EqMap k a -> EqMap k v
  fmap f (EM e) = EM (fmap (fmap f) e)

instance Applicative (EqMap k) where

  -- Map all keys to a constant value.
  pure :: a -> EqMap k a
  pure x = EM (const (Just x))

  -- Intersect two maps with application.
  (<*>) :: EqMap k (a -> b) -> EqMap k a -> EqMap k b
  fs <*> xs = EM (\ k -> emLookup k fs <*> emLookup k xs)

不幸的是,这不仅仅是无限的语义:当您添加或删除键值对时,它在内存中也会无限增长!这是因为条目是一个链接的闭包列表,而不是数据结构:您只能通过添加一个条目来删除映射中的值,就像版本控制系统中的还原一样。对于查找来说,效率也很低,因为查找的键数是线性的,而不是Map的对数。它充其量是初学者-中级功能程序员的一个好的学术练习,只是为了了解如何用函数来表示事物。

这里的一个简单的替代方法是将不存在的键映射为常量值的“默认映射”。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
data DefaultMap k v = DM v (Map k v)

dmLookup :: (Ord k) => k -> DefaultMap k v -> v
dmLookup k (DM d m) = fromMaybe d (Map.lookup k m)

--

然后,Applicative的实现很简单:现有键的交集,加上与默认值一起应用的不存在的键。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
instance Functor (DefaultMap k) where

  -- Map over the return value of the lookup function.
  fmap :: (a -> b) -> DefaultMap k a -> DefaultMap k b
  fmap f (DM d m) = DM (f d) (fmap f m)

instance Applicative (DefaultMap k) where

  -- Map all keys to a constant value.
  pure x = DM x mempty

  -- Intersect two maps with application, accounting for defaults.
  DM df fs <*> DM dx xs = DM (df dx) $ Map.unions
    [ Map.intersectionWith ($) fs xs
    , fmap ($ dx) fs
    , fmap (df $) xs
    ]

DefaultMap有点不寻常,因为您可以删除键值对,但是只有通过有效地“重置”它们的默认值才能删除键值对,因为即使删除了相同的键,对给定密钥的查找也总是成功的。当然,您可以使用默认的Map和始终将定义的键映射到JustDefaultMap k (Maybe v)恢复类似于Just的部分行为。

我认为也有一个instance Monad (DefaultMap k),通过与instance Monad ((->) k)instance Monad (Stream k)的同构,因为与Stream一样,DefaultMap总是无限的,而可能有限的ZipList不可能有Monad实例,因为它必然违反了结合律a >=> (b >=> c) = (a >=> b) >=> c

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63420753

复制
相关文章
Spring 项目启动错误提示 LoggingApplicationListener
上面的问题简单来说就是在你的 Spring 项目中有 2 个版本的 Spring ,你需要找到 Maven 的配置文件中确定只有一个 Spring Boot 的版本。
HoneyMoose
2022/08/29
1.4K0
Spring 项目启动错误提示 LoggingApplicationListener
Spring 项目运行提示错误 Not a managed type
https://www.ossez.com/t/spring-not-a-managed-type/14368
HoneyMoose
2023/04/01
8680
Spring 项目运行提示错误 Not a managed type
Spring Data Commons审计
Spring Data 提供了复杂的支持,以透明地跟踪谁创建或更改了实体以及更改发生的时间。要从功能中获益,您必须为实体类配置审计元数据,这些元数据可以使用注释或通过实现接口来定义。此外,必须通过注解配置或 XML 配置来进行审计以注册所需的基础架构组件。有关配置示例,请参见特定于商店的部分。
IT胶囊
2021/09/29
6710
Spring Data Commons审计
Spring Boot 项目编译时提示错误 cannot access WebApplicationInitializer 错误
因为在 Application 的代码中,我们继承了 SpringBootServletInitializer。
HoneyMoose
2020/04/13
1.5K0
Spring Boot 项目编译时提示错误 cannot access WebApplicationInitializer 错误
Spring项目启动错误处理方式
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/111273.html原文链接:https://javaforall.cn
全栈程序员站长
2022/07/05
9380
Github 上热门的 Spring Boot 项目实战推荐
最近经常被读者问到有没有 Spring Boot 实战项目可以学习,于是,我就去 Github 上找了 10 个我觉得还不错的实战项目。对于这些实战项目,有部分是比较适合 Spring Boot 刚入门的朋友学习的,还有一部分可能要求你对 Spring Boot 相关技术比较熟悉。需要的朋友可以根据个人实际情况进行选择。如果你对 Spring Boot 不太熟悉的话,可以看我最近开源的 springboot-guide:https://github.com/Snailclimb/springboot-gui
Guide哥
2020/05/08
1.3K0
Hadoop如何通过IT审计(上)?
内容: 1. 决策摘要 2. IT和企业风险环境 3. 越来越多的IT规范 4. Hadoop的职能 a. 安全 b. 灾难恢复和业务连续性 c. 资料管理:监督和法律要求 5. 额外要求 6. 关键要点 Hadoop最初并不是为企业环境所创造的,而是针对象Google, Yahoo, Facebook及Twitter等网络数据中心环境而产生的。这些公司拥有无论是架构,支持还是管理都完全不同于企业IT的网络环境
大数据文摘
2018/05/21
1.2K0
Spring 项目启动测试的时候错误:Unable to acquire JDBC Connection
出现这个问题的主要原因是我们在资源文件夹中还有一个 hibernate.properties 文件。
HoneyMoose
2022/10/05
1.5K0
Spring 项目启动测试的时候错误:Unable to acquire JDBC Connection
Spring Batch BATCH_JOB_INSTANCE 表不存在错误
java.sql.SQLSyntaxErrorException: (conn=12433) Table 'usrealestate.BATCH_JOB_INSTANCE' doesn't exist
HoneyMoose
2022/10/11
7320
Spring Batch BATCH_JOB_INSTANCE 表不存在错误
【JAVA代码审计】从零开始的Mybatis框架SQL注入审计(上)
上期分享了JDBC下的注入审计,今天开始分享mybatis框架下的SQL注入审计。
一名白帽的成长史
2022/11/11
1.3K0
【JAVA代码审计】从零开始的Mybatis框架SQL注入审计(上)
代码审计| Spring框架实例篇
Java代码审计Spring框架思路篇中,斗哥为大家讲述了如何得到Spring审计的Demo,审计源码,根据IDEA与Spring框架审计思路初步判定是否存在漏洞。
漏斗社区
2018/08/20
1.2K0
代码审计| Spring框架实例篇
DML错误日志表
前天写了篇文章《表中已存重复数据的情况,如何增加唯一性约束?》,提到了存在唯一约束前提下,重复数据的问题。
bisal
2019/01/29
1.2K0
Spring Cloud Security进行安全审计(一)
Spring Cloud Security是一个用于Spring Boot应用程序的安全框架,它提供了各种安全功能,例如身份验证、授权、密码管理和会话管理等。在现代应用程序中,安全审计是非常重要的一部分,它可以帮助开发人员识别应用程序中的潜在安全漏洞,并保证应用程序的安全性。在本文中,我们将讨论如何使用Spring Cloud Security进行安全审计,并提供一些示例。
堕落飞鸟
2023/04/14
5590
Linux系统实战项目——sudo日志审计
由于企业内部权限管理启用了sudo权限管理,但是还是有一定的风险因素,毕竟运维、开发等各个人员技术水平、操作习惯都不相同,也会因一时失误造成误操作,从而影响系统运行
民工哥
2020/09/16
1.8K0
Linkerd项目完成安全审计(pdf)
“Linkerd是Kubernetes和其他框架的服务网格。它通过提供运行时调试、可观察性、可靠性和安全性 - 所有这些都不需要对代码进行任何更改,从而使运行服务更容易、更安全。”
CNCF
2019/12/04
7630
Linkerd项目完成安全审计(pdf)
Java代码审计| Spring框架思路篇
相信小伙伴们通过Java代码审计入门篇对Java的环境和工具有了一定的了解,重点掌握了Tomcat部署使用、IDEA部署WEB项目与调试、Maven项目管理工具的使用。Java的WEB框架是Java进阶课程,当要进行Spring的漏洞分析,要有一定的Java代码知识储备。
漏斗社区
2018/07/26
2.4K0
Java代码审计| Spring框架思路篇
Spring Cloud Security进行安全审计(二)
现在,我们已经配置了Spring Boot应用程序的审计日志和安全过滤器。接下来,我们需要在代码中记录安全事件,以便后续的审计分析。
堕落飞鸟
2023/04/14
4510
Java代码审计| Spring框架知识篇
在上期的Java代码审计Spring框架思路篇中,斗哥为大家讲述了如何得到Spring审计的Demo,审计源码,根据Spring框架审计思路初步判定是否存在漏洞,剩下就是构造POC,动态调试分析修改POC。本期Java代码审计Spring框架知识篇将讲述Spring构造POC要必备的知识。
漏斗社区
2018/07/26
9860
Java代码审计| Spring框架知识篇
项目总览表
01 前言 分享一下以前做项目时用的一个表。对测试人员来说,这个表格的变种会更有意义。 02 项目总览 先上图 可以使用类似的方式来管理测试任务,有没有感觉高大上那么一点点,^_^。 03 缺陷情况
张树臣
2018/05/15
1.8K0
Spring(上)
参考:https://gitee.com/turnon/spring-tutorial
用户8126523
2023/04/12
6600

相似问题

Hibernate Envers:@子类上的审计

27

Hibernate Envers审计未经审计的实体

35

如何防止Hibernate Envers创建审计表?

11

条件Envers审计

58

使用Hibernate-Envers进行审计的表

14
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文