在java和c#中,我们有接口,在haskell这样的语言中,接口的等价物是什么?或者在函数式编程中,接口的概念叫什么?
irlmq6kh1#
正如其他人的回答所说,有类型类之类的东西,但更重要的是,有一个普遍存在的接口:* 一个函数 *。在很多地方,一个面向对象的程序需要一些定制的接口,一个类似的函数程序可以只使用一个函数。例如,haskell中的map f xs使用f,而一个面向对象的程序可能使用一个策略或任何东西来完成同样的任务。
map f xs
f
qnyhuwrf2#
Haskell typeclasses在面向对象语言中扮演着与接口相同的角色。
wdebmtf23#
函数签名(函数的输入和输出类型)沿着二阶函数(可以放入变量中的函数)承担了面向对象语言中接口的角色。只要函数签名与预期类型匹配,就可以用一个函数替换另一个函数。例如,假设函数f有两个参数:一个整数a和一个函数g,其中函数参数g应该是一个接受int并返回str的函数:
a
g
int
str
fun f(a: int, g:int->str) -> int
通过声明参数g,您现在已经创建了一个接口,您可以为参数g传入任何与g签名匹配的函数。
1szpjjfi4#
Haskell中的data和newtype近似等于Java中的class。Haskell中的class近似等于Java中的interface。
4条答案
按热度按时间irlmq6kh1#
正如其他人的回答所说,有类型类之类的东西,但更重要的是,有一个普遍存在的接口:* 一个函数 *。在很多地方,一个面向对象的程序需要一些定制的接口,一个类似的函数程序可以只使用一个函数。例如,haskell中的
map f xs
使用f
,而一个面向对象的程序可能使用一个策略或任何东西来完成同样的任务。qnyhuwrf2#
Haskell typeclasses在面向对象语言中扮演着与接口相同的角色。
wdebmtf23#
函数签名(函数的输入和输出类型)沿着二阶函数(可以放入变量中的函数)承担了面向对象语言中接口的角色。只要函数签名与预期类型匹配,就可以用一个函数替换另一个函数。
例如,假设函数
f
有两个参数:一个整数a
和一个函数g
,其中函数参数g
应该是一个接受int
并返回str
的函数:通过声明参数
g
,您现在已经创建了一个接口,您可以为参数g
传入任何与g
签名匹配的函数。1szpjjfi4#
Haskell中的data和newtype近似等于Java中的class。
Haskell中的class近似等于Java中的interface。