gpt4 book ai didi

c# - C# 接口(interface)和 Haskell 类型类之间的区别

转载 作者:太空狗 更新时间:2023-10-29 23:59:40 25 4
gpt4 key购买 nike

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

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

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

C#代码:

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

如果没有正确理解,请更正我的例子

最佳答案

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

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

然后您可以将其用作:

readLine :: IO Int
readLine :: IO Bool

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

您可以尝试模拟 Read带有接口(interface)的 C# 类,例如

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

然后执行ReadLine Read<T> 需要一个参数你想要的“实例”:

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

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

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

您不能使用 Eq 表示.接口(interface)隐藏了接收者的类型以及其中一个参数的类型,这可能会导致问题。假设你有一个不可变的类型类和接口(interface) heap datastructure :

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 接口(interface)的实现者不知道其他堆的真实类型,因此被迫使用次优算法或使用动态类型检查来发现它。相反,实现 Heap 的类型类型类确实知道表示。

关于c# - C# 接口(interface)和 Haskell 类型类之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45233416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com