Haskell中解决同名函数调用繁琐问题的标准方案咨询
Haskell中同名不同功能函数的标准解决方法
问题场景
在面向对象语言中,我们可以给不同类定义同名方法,调用时不会有歧义:
class List: def reverse(self) -> None: ... class Car: def reverse(self) -> None: ...
拥有List实例list和Car实例car时,直接调用list.reverse()或car.reverse()即可,非常便捷。
但在Haskell中,直接定义同名函数会引发冲突:
data List = ... reverse :: List -> List reverse = ... data Car = ... reverse :: Car -> Car reverse = ...
虽然可以把两个reverse分别放到List和Car模块中解决冲突,但调用时必须写List.reverse list或Car.reverse car,当类型名称较长时会显得繁琐。而且由于两个reverse功能完全不同,不能用类型类来解决。
标准解决方法
1. 限定导入并使用别名
在导入模块时,给模块或特定函数设置短别名,缩短调用时的写法:
- 给模块设别名:
调用时写import qualified List as L import qualified Car as CL.reverse list、C.reverse car,别名可以根据习惯设为更短的形式(比如Li、Ca)。 - 仅导入特定函数并设别名:
调用时直接用import qualified List (reverse) as revList import qualified Car (reverse) as revCarrevList list、revCar car。
2. 给函数起语义明确的专属名称
这是Haskell社区更推荐的做法——既然两个函数功能完全不同,就不要使用相同名称,而是给它们起更贴合功能的名字:
- 比如保留列表的
reverse,把汽车的倒车函数命名为shiftToReverse或reverseCar:
这样调用时直接写data Car = ... shiftToReverse :: Car -> Car shiftToReverse = ...shiftToReverse car,不需要模块限定,代码可读性也更强,避免了名称混淆的潜在问题。
内容的提问来源于stack exchange,提问作者Frank
相关产品推荐
相关产品推荐

