C# 接口和 Haskell 类型类之间的区别

2023-12-31

我知道这里有一个类似的问题,但我想看一个例子,它清楚地表明,你不能做什么interface并且可以使用 Type Class

为了进行比较,我给你一个示例代码:

class Eq a where 
    (==) :: a -> a -> Bool
instance Eq Integer where 
    x == y  =  x `integerEq` y

C# code:

interface Eq<T> { bool Equal(T elem); }
public class Integer : Eq<int> 
{
     public bool Equal(int elem) 
     {
         return _elem == elem;
     }
}

如果没有正确理解,请纠正我的示例


类型类是根据类型解析的,而接口调度是针对显式接收者对象进行的。类型类参数是隐式提供给函数的,而 C# 中的对象是显式提供的。例如,您可以编写以下 Haskell 函数,该函数使用Read class:

readLine :: Read a => IO a
readLine = fmap read getLine

然后您可以将其用作:

readLine :: IO Int
readLine :: IO Bool

并拥有适当的read编译器提供的实例。

你可以尝试模仿ReadC# 中带有接口的类,例如

public interface Read<T>
{
    T Read(string s);
}

但随后实施ReadLine需要一个参数Read<T>你想要的“实例”:

public static T ReadLine<T>(Read<T> r)
{
    return r.Read(Console.ReadLine());
}

The Eqtypeclass 要求两个参数具有相同的类型,而你的Eq接口没有,因为第一个参数隐式是接收者的类型。例如,您可以:

public class String : Eq<int>
{
    public bool Equal(int e) { return false; }
}

你不能用它来表示Eq。接口隐藏了接收者的类型,从而隐藏了参数之一的类型,这可能会导致问题。想象一下你有一个不可变的类型类和接口堆数据结构 https://en.wikipedia.org/wiki/Heap_(data_structure):

class Heap h where
  merge :: Ord a => h a -> h a -> h a

public interface Heap<T>
{
    Heap<T> Merge(Heap<T> other);
}

合并两个二项堆可以在 O(n) 内完成,而合并两个二项式堆可以在 O(n log n) 内完成,对于斐波那契堆来说,它是 O(1) 。 Heap 接口的实现者不知道另一个堆的真实类型,因此被迫使用次优算法或使用动态类型检查来发现它。相反,实现的类型Heap类型类确实知道表示形式。

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

C# 接口和 Haskell 类型类之间的区别 的相关文章

  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre
  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • 以文化中立的方式将字符串拆分为单词

    我提出了下面的方法 旨在将可变长度的文本拆分为单词数组 以进行进一步的全文索引处理 删除停止词 然后进行词干分析 结果似乎不错 但我想听听关于这种实现对于不同语言的文本的可靠性的意见 您会建议使用正则表达式来代替吗 请注意 我选择不使用 S
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • 在哪里可以找到列出 SSE 内在函数操作的官方参考资料?

    是否有官方参考列出了 GCC 的 SSE 内部函数的操作 即 头文件中的函数 除了 Intel 的 vol 2 PDF 手册外 还有一个在线内在指南 https www intel com content www us en docs in
  • PHP 接口有属性吗?

    PHP 中的接口有属性 还是只有方法 您可以在 DocBlock 中为接口声明属性 然后 IDE 将提示接口的这些属性 PhpStorm 会这样做 但这不会强制在实现类中实际实现这些字段 例如 property string passwor
  • 嵌套接口:将 IDictionary> 转换为 IDictionary>?

    我认为投射一个相当简单IDictionary
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 重载<<的返回值

    include
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 如何设计以 char* 指针作为类成员变量的类?

    首先我想介绍一下我的情况 我写了一些类 将 char 指针作为私有类成员 而且这个项目有 GUI 所以当单击按钮时 某些函数可能会执行多次 这些类是设计的单班在项目中 但是其中的某些函数可以执行多次 然后我发现我的项目存在内存泄漏 所以我想
  • 如何在整个 ASP .NET MVC 应用程序中需要授权

    我创建的应用程序中 除了启用登录的操作之外的每个操作都应该超出未登录用户的限制 我应该添加 Authorize 每个班级标题前的注释 像这儿 namespace WebApplication2 Controllers Authorize p
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 链接器错误:已定义

    我尝试在 Microsoft Visual Studio 2012 中编译我的 Visual C 项目 使用 MFC 但出现以下错误 error LNK2005 void cdecl operator new unsigned int 2
  • 向现有 TCP 和 UDP 代码添加 SSL 支持?

    这是我的问题 现在我有一个 Linux 服务器应用程序 使用 C gcc 编写 它与 Windows C 客户端应用程序 Visual Studio 9 Qt 4 5 进行通信 是什么very在不完全破坏现有协议的情况下向双方添加 SSL
  • 通过指向其基址的指针删除 POD 对象是否安全?

    事实上 我正在考虑那些微不足道的可破坏物体 而不仅仅是POD http en wikipedia org wiki Plain old data structure 我不确定 POD 是否可以有基类 当我读到这个解释时is triviall
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 哪种 C 数据类型可以表示 40 位二进制数?

    我需要表示一个40位的二进制数 应该使用哪种 C 数据类型来处理这个问题 如果您使用的是 C99 或 C11 兼容编译器 则使用int least64 t以获得最大的兼容性 或者 如果您想要无符号类型 uint least64 t 这些都定
  • Windows 和 Linux 上的线程

    我在互联网上看到过在 Windows 上使用 C 制作多线程应用程序的教程 以及在 Linux 上执行相同操作的其他教程 但不能同时用于两者 是否存在即使在 Linux 或 Windows 上编译也能工作的函数 您需要使用一个包含两者的实现

随机推荐

  • 透明的UITextView

    如何使 UITextView 透明 我在 Interface Builder 中构建了视图 并将 UITextView 放入其中 它覆盖了背景 有任何想法吗 更改背景颜色 并使用不透明度滑块使其完全透明 以编程方式 textView bac
  • C# .NET Rx-System.Reactive 在哪里?

    我有深入的 Java 背景 所以如果我忽略了 C 中明显的东西 请原谅我 但我的研究毫无进展 我正在尝试使用反应式 Rx NET 库 编译器并没有抱怨IObservable但它是通过调用zip方法 它抛出 您是否缺少 using 指令或程序
  • 除非已通过 Windows 资源管理器打开,否则无法打开共享点 UNC 路径

    我希望有人能阐明这一点 因为它一直让我分心 我有一个脚本 如果该路径存在 它将通过 UNC 路径将其创建的报告保存到共享点文档库 否则它将保存到网络驱动器位置的 UNC 路径作为后备 我注意到检查test path 保存 通过 msexce
  • 未找到 XML 扩展

    我有 centos 6 5 服务器 当我尝试使用安装 php 扩展时pecl我收到以下错误 XML Extension not found 所有文档都说默认包含此扩展 为什么此错误仍然存 在 根据php net 上的评论 https sec
  • JUnit 测试:如何使用 try-catch 块检查错误

    因此 我需要为我正在改进的一些 遗留 代码编写测试 在一个方法中 我尝试解析一些字符串 应该是合法的 JSON 那么一个可能的JSONException如果字符串不代表有效的 JSON 则会捕获该错误 就像是 public void tra
  • 使用 Python 读取元数据

    在过去的两天里 我一直在浏览互联网 试图找到解决我的问题的方法 我有一个包含不同文件的文件夹 他们运行文件类型的策略 我正在尝试编写一个 python 脚本 该脚本将从每个文件中读取元数据 如果存在 目的是最终将数据输出到文件中 以便与另一
  • 联合身份验证后,重定向到最初请求的 url

    我们使用 ThinkTecture 服务器设置了联合安全性 当用户希望访问特定 URL 时 他们会被重定向到身份提供商服务器 IDP 然后登录并获得身份验证 然后 IDP 服务器会将用户重定向回该依赖方配置中指定的 重定向 URL 相反 我
  • 在 SQL 中查询 GeoLite2 国家/地区 CSV

    有谁知道如何使用 SQL 从 MaxMind 的 GeoLite2 Country CSV 查找 IP4 地址 我已经使用 MaxMind 的免费 G eoIP 数据很多年了 并且想升级到他们的 GeoLite2 数据 我已将块和位置数据加
  • 笔记本验证失败 Jupyter

    这不是重复的笔记本验证失败 https stackoverflow com questions 61453312 notebook validation failed I have a Jupyter ntb which was worki
  • 如何开发、构建和部署多个基于 OSGi 的 Web 应用程序

    我正在寻找一种方法来开发 构建和部署多个基于 OSGi 的 Web 应用程序 一些 RAP 首先 我使用从以下位置克隆的 RAP 示例 https github com eclipse rap git https github com ec
  • 如何在ES中使用数组映射?

    我想创建一个映射movies看起来像 title The Artist genres Drama Comedy In the ElasticSearch 文档 https www elastic co guide en elasticsea
  • Rust 中的指针和引用有什么区别?

    一个指针 和一个参考 在 Rust 中共享相同的表示 它们都表示一段数据的内存地址 编写代码时有什么实际差异 将 C 代码移植到 Rust 时 是否可以安全地替换它们 C 指针 gt rust 指针 C 引用 gt rust 引用 可以时使
  • GDB使用什么信号来实现tracee和tracer之间的控制传递

    通过控制转移 我的意思是 在tracee执行函数并返回后 会生成哪个信号以便GDB可以在其上等待 并再次夺取控制权 尽管很多人声称这不是 SIGTRAP 在tracee执行函数并返回后 会生成哪个信号以便GDB可以在其上wait 并再次夺取
  • C#中的无锁会话有哪些?

    我了解 C 中的会话以及如何定义它们 但今天我听到一个词Lock free session 我用谷歌搜索但没有得到任何与我的问题完全匹配的答案 谁能解释一下 C 中的无锁会话以及如何为它们编写代码 以下是一些内容来自msdn http ms
  • 如何使动态创建的div可编辑

    我要实现div创建的可编辑动态地 这也是可拖动的 div 这就是我尝试过的 1 divid attr contentEditable true 2 divid live click function this click contentEd
  • 获取 glFrustum 的坐标

    我刚刚开始阅读有关OpenGL主题 特别是关于Viewing http glprogramming com red chapter03 html以满足我目前的需求 我试图理解glFrustum根据我的理解 对我在屏幕上绘制的对象进行透视投影
  • 从 JVM 上的堆栈帧获取局部变量

    有没有办法在不使用调试器的情况下在 JVM 上获取当前范围内的局部变量的映射或其他数据结构 即获取当前栈帧的局部变量 我知道有堆栈跟踪对象 但是StackTraceElement无法访问任何状态 它只是告诉您在哪里调用了什么方法 但不告诉您
  • 无法设置 Content-Type 标头

    我在 HttpClient 上设置 Content Type 时遇到问题 我沿着这个问题 如何为 HttpClient 请求设置 Content Type 标头 https stackoverflow com questions 10679
  • 计算机编程艺术中approximateEqual和essentialEqual的区别

    我从其他地方得到这个代码片段 据站长介绍 代码摘自 由于我没有那本书 请问这两个函数有什么区别 bool approximatelyEqual float a float b float epsilon return fabs a b lt
  • C# 接口和 Haskell 类型类之间的区别

    我知道这里有一个类似的问题 但我想看一个例子 它清楚地表明 你不能做什么interface并且可以使用 Type Class 为了进行比较 我给你一个示例代码 class Eq a where a gt a gt Bool instance