类型类是必需的吗?

2024-03-02

我曾经问过一个问题哈斯克尔初学者 https://groups.google.com/forum/#!topic/haskell-cafe/C1zGMkYGTOY,是否使用 data/newtype 还是类型类。在我的特殊情况下,事实证明不需要类型类。此外,汤姆·埃利斯(Tom Ellis)给了我一个绝妙的建议,当我有疑问时该怎么做:

回答这个问题最简单也是最正确的方法是:

使用数据

我知道类型类可以让一些东西变得更漂亮,但没多大作用。让我印象深刻的是,类型类主要用于脑干的东西,而在较新的东西中,新的类型类几乎不会被引入,一切都是通过 data/newtype 完成的。

现在我想知道是否存在绝对需要类型类而无法用 data/newtype 表达事物的情况?

回答类似问题堆栈溢出 https://stackoverflow.com/questions/17100036/should-i-use-typeclasses-or-not加布里埃尔·冈萨雷斯说

在以下情况下使用类型类:

每种给定类型只有一种正确的行为

类型类具有所有实例都必须满足的关联方程(即“定律”)

Hmm ..

或者类型类和数据/新类型是否由于历史原因而共存,有些相互竞争的概念?


我认为类型类areHaskell 的重要组成部分。

它们是 Haskell 的一部分,使其成为我所知道的最容易重构的语言,并且它们对于您能够推断代码的正确性来说是一笔巨大的财富。

那么,我们来谈谈字典传递。

现在,任何类型的字典传递都是对传统面向对象语言的状况的重大改进。我们知道如何在 C++ 中使用 vtable 进行 OOP。然而,在 OOP 语言中,vtable 是“对象的一部分”。将 vtable 与对象融合会迫使你的代码变成一种形式,在这种形式中,你对谁可以用新功能扩展核心类型有严格的纪律,实际上只有类的原始作者必须将其他人想要融入的所有东西结合起来他们的类型。这导致了“熔岩流代码”和各种其他设计反模式等。

像 C# 这样的语言让你能够侵入扩展方法来伪造新的东西,而 scala 等语言的“特征”和其他语言的多重继承也让你可以委托一些工作,但它们只是部分解决方案。

当你将 vtable 从它们操作的对象中分离出来时,你会得到一股令人兴奋的力量。现在您可以将它们传递到任何您想要的地方,但是当然您需要命名它们并谈论它们。围绕模块/函子的 ML 规则和显式字典传递风格采用了这种方法。

类型类采取稍微不同的策略。我们依赖于给定类型的类型类实例的唯一性,并且主要是这种选择,它允许我们摆脱这种简单的核心数据类型。

Why?

因为我们可以将字典的使用转移到使用站点,而不必将它们与数据类型一起携带我们可以相信,当我们这样做时,代码的行为没有任何改变.

将代码机械翻译为更复杂的手动传递的字典会失去此类字典在给定类型下的唯一性。现在,在程序的不同点传递字典会导致程序具有截然不同的行为。您可能需要也可能不需要记住构造您的数据类型所用的字典,如果您想根据您的参数进行条件行为,那么您将遭遇不幸。

对于简单的例子,例如Set您可以通过手动词典翻译来摆脱困境。价格好像没那么高。你必须在字典中烘焙,比如说,你想如何排序Set当你制作这个物体然后insert/lookup,只会保留您的选择。这可能是你可以承受的成本。当你联合两个Set当然,现在您收到的订单还是悬而未决的。也许你把较小的插入到较大的中,但是顺序会随意改变,所以你必须把左边的插入到右边,或者记录这种随意的行为。为了“灵活性”,您现在被迫采用性能不佳的解决方案。

But Set这是一个简单的例子。在那里,您可以将索引烘焙到有关您正在使用的实例的类型中,只涉及一个类。当您想要更复杂的行为时会发生什么?我们用 Haskell 做的事情之一就是使用 monad 转换器。现在你有lots大量的实例漂浮在周围——而你没有一个好的地方来存储它们,MonadReader, MonadWriter, MonadState等等都可以根据底层 monad 有条件地应用。当您吊起并更换它时会发生什么,现在不同的事情可能适用或可能不适用?

为此携带显式字典需要大量工作,没有一个好的地方来存储它们,并且您要求用户采用全局程序转换来采用这种做法。

这些都是类型类可以轻松完成的事情。

我相信你应该将它们用于所有事情吗?

不是由一个长镜头。

但我不同意这里的其他回复,认为它们对 Haskell 来说是无关紧要的。

Haskell 是唯一提供它们的语言,并且它们至少对于my用这种语言思考的能力,这是我将 Haskell 视为家的一个重要原因。

我确实同意这里的一些事情,当有法律并且选择明确时使用类型类。

然而,我会质疑,如果你没有法律或者选择不明确,你可能对如何建模问题域了解不够,并且应该寻找你想要的东西can将其放入类型类模型中,甚至可能放入现有的抽象中——当您最终找到该解决方案时,您会发现可以轻松地重用它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

类型类是必需的吗? 的相关文章

  • Traversable 类型类的用途

    有人可以向我解释一下类型类的目的是什么吗Traversable 类型类定义是 class Functor t Foldable t gt Traversable t gt where So Traversable is a Functor
  • QuickCheck是否可以生成任意函数

    我试图为身份编写一个 QuickCheck 测试 f y f y 我最初的计划是编写一个返回函数和整数的任意生成器 具有签名Gen Int gt Int Int 并在prop DollerDoesNothing使用 不使用测试该功能应用程序
  • Haskell:IORef 的性能

    我一直在尝试在 Haskell 中编码一个需要使用大量可变引用的算法 但与纯粹的惰性代码相比 它 也许并不奇怪 非常慢 考虑一个非常简单的例子 module Main where import Data IORef import Contr
  • : 中缀运算符在 Haskell 中的作用是什么?

    我正在阅读Haskell 简要介绍 http www haskell org tutorial index html 这不是那么温和 并且它反复使用 操作符而不直接解释它的作用 那么 它到底有什么作用呢 是 前置 运算符 x xs 返回一个
  • 我该如何实现这个折叠功能呢?

    给出了两种数据类型 颜色 和 植物 data Color Red Pink White Blue Purple Green Yellow deriving Show Eq data Plant Leaf Blossom Color Stal
  • 在 Haskell 中合并两个列表

    无法弄清楚如何合并两个列表通过以下方式在哈斯克尔 INPUT 1 2 3 4 5 11 12 13 14 OUTPUT 1 11 2 12 3 13 4 14 5 我想提出一个更懒的合并版本 merge ys ys merge x xs y
  • 如何通过“cabal build”或“stack build”构建带有图标的项目

    我想构建一个带有图标的可执行文件 通过谷歌搜索 我发现这里的说明 https wiki haskell org Setting an executable icon 但它只能通过编译源文件来工作ghc 如果我想构建一个具有可执行文件的项目c
  • Haskell Data.Decimal 作为 Aeson 类型

    是否可以解析一个数据 十进制 https hackage haskell org package Decimal 0 4 2 docs Data Decimal html使用 Aeson 包从 JSON 获取 假设我有以下 JSON foo
  • 类型级别集结合律的证明

    我试图证明类型级函数Union https hackage haskell org package type level sets 0 8 5 0 docs Data Type Set html t Union是关联的 但我不确定应该如何完
  • C++ 概念与 Haskell 类型类有何不同?

    Concepts TS 中的 C 概念最近已合并到 GCC 主干中 概念允许人们通过要求类型满足概念的条件 例如 可比较 来约束通用代码 Haskell 有类型类 我对 Haskell 不太熟悉 概念和类型类如何相关 概念 由概念 TS 定
  • 构造微积分中的“Refl”东西?

    在语言中 例如Agda Idris or Haskell对于类型扩展 有一个 键入类似于以下内容的内容 data a b where Refl a a a b意思是a and b是相同的 这样的类型可以定义在结构演算 https en wi
  • 在 Haskell 中获取玫瑰树的根

    最近我开始学习 Haskell 并在以下练习中遇到困难 Write functions root Rose a gt a and children Rose a gt Rose a that return the value stored
  • 自定义 monad 的 MonadTransControl 实例

    的文档monad control提供有关如何创建实例的示例MonadTransControl using defaultLiftWith and defaultRestoreT 该示例适用于以下情况newtype newtype Count
  • Haskell 中多核编程的现状如何?

    Haskell 中多核编程的现状如何 现在有哪些项目 工具和库可用 有哪些经验报道 2009年至2012年期间 发生了以下事件 2012 从 2012 年开始 并行 Haskell 状态更新开始出现在并行 Haskell 摘要 http w
  • 为什么我不能声明推断类型?

    我有以下内容 runcount Eq a Num b gt a gt b runcount runcountacc 0 runcountacc Eq a Num b gt b gt a gt b runcountacc n runcount
  • 并行 Haskell - GHC GC 火花

    我有一个正在尝试并行化的程序 带有可运行代码的完整粘贴here http lpaste net 101528 我进行了分析 发现大部分时间都花在findNearest这本质上是一个简单的foldr超过一个大Data Map findNear
  • 这是 unsafeCoerce 的安全使用吗?

    我遇到的情况是 我目前正在使用极其可怕的函数 unsafeCoerce 幸运的是 这并不是为了任何重要的事情 但我想知道这是否是该函数的安全使用 或者是否有其他方法可以解决其他人知道的这个特定问题 我的代码类似于以下内容 data Toke
  • 优化 Haskell 内循环

    仍在 Haskell 中进行 SHA1 实现 我现在已经有了一个有效的实现 这是内部循环 iterateBlock Int gt Word32 gt Word32 gt Word32 gt Word32 gt Word32 gt Word3
  • 使用默认值压缩而不是删除值?

    我正在 haskell 中寻找一个函数来压缩两个长度可能不同的列表 我能找到的所有 zip 函数都只是删除列表中比其他列表长的所有值 例如 在我的练习中 我有两个示例列表 如果第一个比第二个短 我必须用 0 填充 否则我必须使用 1 我不允
  • Haskell Cabal:“包间接依赖于同一包的多个版本”

    清除我的所有后cabal installed 包 我运行了以下会话 cabal update Downloading the latest package list from hackage haskell org james bast c

随机推荐

  • random.randint 在具有相同种子的 Python 2.x 和 Python 3.x 中显示不同的输出

    我正在将应用程序从 python 2 移植到 python 3 并遇到以下问题 random randint根据使用的Python版本返回不同的结果 所以 import random random seed 1 result random
  • Java Spring @Scheduled 任务执行两次

    我这里有一个简单的测试方法 设置为每 5 秒运行一次 并且确实如此 但是查看 System out 您可以看到它似乎在做一些奇怪的事情 Scheduled cron 5 public void testScheduledMethod Sys
  • 从 EJB3 迁移到 Spring、Hibernate

    我们有一个基于 EJB3 Oracle 10 和 JBoss 4 的桌面应用程序 这是大约三年前创建的 JPA 实体用于 ORM 业务逻辑在无状态会话 bean 中实现 客户端是使用Swing API 开发的 现在需要在下一个版本的应用程序
  • Android 片段屏幕重叠

    我有一个使用片段的应用程序 在我的用户的一台设备 HTC One 上 碎片相互重叠 他的屏幕最终看起来一团糟 我尝试在自己的硬件上重现它 尽管它不是 HTC One 我也尝试过使用 android 版本 4 1 2 这是他拥有的版本 并且运
  • Flutter:如何使整行可点击

    如何使整行在颤振中可点击 我将以下代码包装在 GestureDetector 中 行中的各个项目是可单击的 但小部件周围的空白区域不可单击 if auth isLoggedIn GestureDetector onTap auth sign
  • 如何生成sse4.2 popcnt机器指令

    使用c程序 int main int argc char argv return builtin popcountll 0xf0f0f0f0f0f0f0f0 和编译器行 gcc 4 4 Intel Xeon L3426 gcc msse4
  • org-mode 无法编辑 C 源代码

    当我使用 emacs 的 org mode 编辑 C 程序时 即编辑以下代码段 begin src c define MAX 100 end src 当我调用函数 org edit src code 在新缓冲区中编辑 C 代码后 出现错误
  • 如何用Java“正确”检测显示器的DPI?

    我有以下绘制规则的应用程序 public class Rule extends JComponent public static final long serialVersionUID 26362862L public static fin
  • SQL 对值求和

    我是 SQL 新手 我不知道如何做到这一点 我想对类似的对 vin action 求和一个名为 total spending 的coulmn 并选择第一个dealer name和参考月份年份 因此它不会创建重复项 并具有如下示例的输出 输入
  • 使用shell脚本删除文件夹内容

    我在尝试清空脚本中的文件夹时遇到问题 这在我的命令行中工作 rm r Folder1 Folder2 但如果在我的脚本中我这样做 DIR Folder1 Folder2 rm r DIR 它说 rm Folder1 Folder2 没有这样
  • Makefile:多重定义和未定义的引用错误

    我目前正在学习如何在没有 IDE 的情况下进行编码 因此我正在学习如何编写 makefile 这是我当前的测试项目 CoDstructor Makefile bin CoDstructor exe src cod main cpp type
  • Windows Azure 不生成 aspx 文件

    我设置了我的第一个 Azure Cloude 服务和 Web 角色 当我构建然后发布应用程序时 我只能看到包含所有 dll 的 bin 目录 我没有任何文件夹或 aspx 文件 ProjectName CloudService bin De
  • ASP.Net Core 2.0 中 [AllowHtml] 的替代品是什么[重复]

    这个问题在这里已经有答案了 我想将 CKEditor 集成到我的 MVC Core 2 0 应用程序中 在之前的版本中 我通过向字符串属性添加 AllowHTML 数据注释来使用它 但在 ASP Net Core 中我找不到将 HTML 插
  • 想要列表中不重复的元素

    从下面的列表中 我只需要 哇 和 退出 List
  • Rails 中的一对一或零关联

    Model I class TimeLog lt ActiveRecord Base has one custom time fields dependent gt destroy end Model II class CustomTime
  • 在代号一中使用 LocationManager 的正确方法

    我正在使用 LocationManager 来跟踪用户的位置并在 GoogleMaps 上显示相同的位置 我正在使用以下方法 但对此有一些疑问 为了第一次获取用户的位置 我使用 locationManager LocationManager
  • Microsoft VB.NET 命名约定

    VB NET 有标准命名约定吗 根据您的编程经验 想分享您对 VB NET 的命名约定吗 除了这种良好实践之外 还有任何指南吗 模式与实践 http www codeplex com Wiki View aspx ProjectName g
  • kubectl 端口转发和 NodePort 服务之间的区别

    kubectl port forwarding 将端口从本地主机转发到集群中的 pod 以获取对集群资源的访问权限 和 NodePort 服务类型之间有什么区别 您正在比较两个完全不同的事物 你应该compare https medium
  • 添加 google-play-services 后,您需要在此活动中使用 Theme.AppCompat 主题(或后代)

    在我目前正在开发的应用程序中 这是我的第一个 Android 应用程序 我使用 android maven plugin 和 maven android sdk deployer 应用程序一直运行良好 使用 ActionBarActivit
  • 类型类是必需的吗?

    我曾经问过一个问题哈斯克尔初学者 https groups google com forum topic haskell cafe C1zGMkYGTOY 是否使用 data newtype 还是类型类 在我的特殊情况下 事实证明不需要类型