gpt4 book ai didi

Haskell 不支持 C++ 重载风格,其中不同类型的函数共享一个通用名称

转载 作者:行者123 更新时间:2023-12-02 15:31:24 25 4
gpt4 key购买 nike

我正在学习 Haskell。当我浏览以下文档时。 https://www.haskell.org/tutorial/classes.html

提到“Haskell 不支持不同类型的函数共享通用名称的 C++ 重载风格”。我没有得到这个声明,我猜临时多态性(通过使用类型类完成)相当于 C++、Java 中的方法重载。有人可以解释一下我的理解是否正确吗?

class Equal a where

isEquals :: a -> a -> Bool


type Id = Int
type Name = String

data Employee = Engineer Id Name

data Student = Student Id Name

getEmpId (Engineer empId _) = empId
getStudId (Student studId _) = studId

instance Equal Employee where
isEquals emp1 emp2 = getEmpId emp1 == getEmpId emp2

instance Equal Student where
isEquals stud1 stud2 = getStudId stud1 == getStudId stud2

在上面的代码片段中,'isEquals'函数应用于两种不同的类型Employee、Student,相当于C++、Java中的重载。我的理解正确吗?

最佳答案

部分是的。但是,请记住,isEquals 的签名始终为 a -> a。在 C++ 中你可以轻松地编写:

int foo(int a, int b)
int foo(int a, char b)
int foo(char a, char b)

通过使用类型类,您只能获得第一个和第三个函数,而不能获得第二个。

更新1:

如评论中所述,您可以使用 MultiParamTypeClasses 扩展来实现第二个版本(如果您使用的是 GHC)。不过,还有第四个版本:

int foo(int a, int a, int a)

如果您使用类型类,则其数量错误,但在 C++ 中完全没问题。

关于Haskell 不支持 C++ 重载风格,其中不同类型的函数共享一个通用名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36626313/

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