首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >没有类型类的回溯,有解决办法吗?

没有类型类的回溯,有解决办法吗?
EN

Stack Overflow用户
提问于 2015-02-17 13:01:48
回答 1查看 380关注 0票数 15

在1点20分左右的时候中,Edward提到Haskell中缺少“类型类回溯”。考虑清单上执行的“集合相等”问题(忽略了顺序和多重性):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
equals :: [a] -> [a] -> Bool

根据类型类的性质,如果我们只有Eq a,则不能提供低效的O(n平方)比较,但如果有Ord a,则可以有效地比较O(N log )中的列表。

我确实明白为什么这样的设施会有问题。同时,爱德华说有一些“你可以玩的把戏”,比如提到类型的家庭。

因此,我的问题是,怎样才能达到同样的效果:

  • 提供了(低效)默认实现。
  • 如果用户能够提供有关该类型的其他信息,我们将“解锁”一个更有效的实现。

此解决方案不一定需要使用类型类。

编辑:有些人建议简单地将equalsefficientEquals作为两种不同的方法提供。总的来说,我同意这是更Haskell-惯用的方法。然而,我不相信这总是可能的。例如,如果上面的equals方法本身是类型类的一部分,该怎么办:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class SetLike s where
    equals :: Eq a => s a -> s a -> Bool

假设这个类是由其他人提供的,所以我不能简单地向类型类型添加一个新函数。现在我要定义[]的实例。我知道[]总是可以提供equals的实现,不管a上有什么约束,但是如果有更多关于a的信息,我不能告诉我的实例使用更高效的版本。

也许我可以将列表包装在一个newtype中,并使用一些附加的类型信息标记它?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-02-18 09:55:47

在编辑的场景中,可以使用GADT作为Ord约束的证明:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{-# LANGUAGE GADTs #-}

import Data.List

class SetLike s where
    equals :: Eq a => s a -> s a -> Bool

data OrdList a where
    OrdList :: Ord a=> [a] -> OrdList a

instance SetLike OrdList where
    equals (OrdList a) (OrdList b) = sort a == sort b

为了好玩,这里有一些东西使用了我在评论中提到的OverlappingInstances技巧。有很多方法可以做这样的事情:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{-# LANGUAGE DefaultSignatures, OverlappingInstances, UndecidableInstances, MultiParamTypeClasses, FlexibleInstances #-}

import Data.List

class Equals a where
    equals :: [a] -> [a] -> Bool

    default equals :: Ord a=> [a] -> [a] -> Bool
    equals as bs = sort as == sort bs

instance Equals Int
instance Equals Integer
instance Equals Char
-- etc.

instance (Eq a)=> Equals a where
    equals = error "slow version"
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28571035

复制
相关文章
Java有值类型吗?
有人看了我之前的文章『Swift 语言的设计错误』,问我:“你说 Java 只有引用类型(reference type),但是根据 Java 的官方文档,Java 也有值类型(value type)和引用类型的区别的。比如 int,boolean 等原始类型就是值类型。” 现在我来解释一下这个问题。
哲洛不闹
2018/09/14
5.7K1
Java有值类型吗?
org/apache/hadoop/hbase/CompatibilityFactory(scan)没有找到类的解决办法
在做spark连接Hbase的时候,总会蹦出一些问题。总结起来就是各种类的找不到。 如:org/apache/hadoop/hbase/CompatibilityFactory没有找到类, E xception in thread "main" java.lang.NoClassDefFoundError: org/apache/hadoop/hbase/client/Scan 如此等等。 这些问题的核心还是没有正确加载Hbase所需要的库。 而Hbase中的一些库存在的会与spark中有一些版本
sparkexpert
2018/01/09
1.8K0
回溯类问题框架
文章目录 N叉树的前序遍历 回溯框架 示例 4*4数独 N叉树的前序遍历 void preorder(Node* node) { cout << "value:" << node->val << endl; for (Node* n : node->children) { preorder(n); } return; } 其实回溯,可不就是N叉树的前序遍历带上功能嘛。 ---- 回溯框架 vector<T> res; void back_track(路
看、未来
2021/10/09
3220
回溯类问题框架
Elasticsearch 有没有数组类型?有哪些坑?
近期 Elasticsearch 数组问题被问到的比较多,为了方便大家对数组建立全局认知,我把数组相关实战问题梳理出来,让更多后来人遇到类似问题少走不必要的弯路。
铭毅天下
2022/01/05
3.2K0
spark submit中没有找到hbase中的*/hbase/client/put类的解决办法
在Eclipse或者IDEA中进行spark与hbase联接操作时,都没有错误,然后发现当进行spark-submit提交的时候,却发现找不到hbase库的问题。 如截图所示。 这个问题的核心肯定是找
sparkexpert
2018/01/09
7910
spark submit中没有找到hbase中的*/hbase/client/put类的解决办法
redux(应用的状态管理器)有那么难吗?没有!
Redux由Flux演变而来,提供几个简单的API来实现状态管理,所谓状态指的是应用数据,所以,Redux本质上是用来管理数据的。 进一步,Redux配合支持数据绑定的视图库使用,就可以将应用状态和视图一一对应,开发者不需要再去关心DOM操作,只关心如何组织数据即可。
前端迷
2019/12/05
3.4K0
mysql改变主键字段类型吗_mysql修改字段类型有哪些?
mysql修改字段类型有:1、添加字段【alter table table1(表名)add No_id(字段名)】;2、修改字段类型【t1(表名) alter column a(字段名)】;3、删除某表的字段【drop ‘cpid’】。
全栈程序员站长
2022/08/14
8.2K0
mysql改变主键字段类型吗_mysql修改字段类型有哪些?
你知道 JavaScript 中的错误对象有哪些类型吗?
每当 JavaScript 中发生任何运行时错误时,都会引发Error对象。 在许多情况下,我们还可以扩展这些标准Error对象,以创建我们自己的自定义Error对象。
前端小智@大迁世界
2020/05/12
7K1
你知道 JavaScript 中的错误对象有哪些类型吗?
引用数据类型分为哪三类_类都是引用数据类型吗
说到引用数据类型,那么何为引用数据类型? 引用类型,都可以用null值作为值,也就是说可以在初始化的时候赋值为null,String是引用类型,也就是说可以使用null作为值。
全栈程序员站长
2022/11/01
7090
引用数据类型分为哪三类_类都是引用数据类型吗
你知道 Redis 有 JSON 数据类型吗?
Redis 本身有比较丰富的数据类型,例如 String、Hash、Set、List
芋道源码
2018/12/29
3.6K0
RNN和LSTM有长期记忆吗?并没有!| ICML 2020
本文介绍的是ICML 2020 论文《Do RNN and LSTM have Long Memory? 》,论文作者来自华为诺亚方舟实验室与港大。 作者 | 诺亚方舟实验室 编辑 | 丛 末 论文地
AI科技评论
2020/06/30
2.6K0
RNN和LSTM有长期记忆吗?并没有!| ICML 2020
Ubuntu 没有 chkconfig 服务解决办法
ubuntu下chkconfig命令可以使用sysv-rc-conf 服务管理程序代替,只需要apt安装即可
为为为什么
2022/08/06
4.7K0
软件测试的类型有哪些?不同的类型有什么优势?
软件完成开发后都会进入软件开发测试,测试方法不到位会导致产品中的缺陷难以检测出,从而影响产品性能,为了提升产品的核心竞争力,为确保产品顺利上线使用,软件测试非常重要,那么测试的类型有哪些?不同的类型有什么优势?
用户8715145
2021/06/18
2.4K0
你知道有几种方式来判断JS的数据类型吗?
因为JavaScript是一门弱引用类型的语言,所以在开发过程中我们常常会遇到 “我定义的这个变量是什么数据类型?”这种类似的问题,所以今天我们来看看在JS中一般用什么方式来判断数据类型的。
用户2802329
2020/03/17
2.6K0
MacOS没有管理员账号的解决办法
重启电脑,启动时按住command+s,进入单一用户模式 输入 mount -uw /,然后回车 输入 rm /var/db/.AppleSetupDone ,然后回车 输入 reboot ,然后回车,电脑就会重启了
飞奔去旅行
2019/06/13
2.1K0
C# 项目没有.sln文件的解决办法:
什么是sln文件? sln文件开发中使用的解决方案文件,使用解决方案文件(后缀为sln的文件)表示一个项目组,他通常包含一个项目中所有的工程文件信息。包括文件版本,工程信息,全局设置,通过打开sln文件就可以加载整个项目.
全栈程序员站长
2022/08/18
1.4K0
C# 项目没有.sln文件的解决办法:
子类可以继承到父类上的注解吗--有结论了
-----------------------------------------------------------------
lyb-geek
2018/07/26
2.9K0
比Python更牛的语言有吗?看我用元类(metaclass)花式创建Python类
为了让更多的人看到本文,请各位读者动动小手,点击右上角【...】,将本文分享到朋友圈,thanks!
蒙娜丽宁
2020/11/04
8120
数据封装类有什么用,比普通数据类型有什么优势?
下面列出了一些数据封装类。引入数据封装类有什么用呢?既然它们是类,就有方法,就可以被我们利用。比如,Integer中toHexString方法,可以轻松吧十进制转换成16进制数,马克-to-win:而你int简单类型有这功能吗?
马克java社区
2021/03/29
5720
数据封装类有什么用,比普通数据类型有什么优势?
php编译时没有phpize文件的解决办法
php编译时没有phpize文件的解决办法,常码字不易,出精品更难,没有特别幸运,那么请先特别努力,别因为懒惰而失败,还矫情地将原因归于自己倒霉。你必须特别努力,才能显得毫不费力。如果这篇文章能给你带来一点帮助,希望给飞兔小哥哥一键三连,表示支持,谢谢各位小伙伴们。
用户8053452
2021/05/31
1K0

相似问题

这里没有地图类型和缩放更改事件。有什么解决办法吗?

20

对于相互调用的类,有什么解决办法吗?

23

在MicrosoftGraph中没有UsersPermissionToUserConsentToAppEnabled,有什么解决办法吗?

220

有更简单的解决办法吗?

10

存储对类成员的引用。有很好的解决办法吗?

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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