说我正在使用Haskell创建一个图像处理库。 我已经定义了一些自己的数据类型。
我什么时候应该将我的一些数据类型声明为Monad(或仿函数或应用仿函数等)? 这样做有什么好处?
据我所知,如果某些数据类型可以映射到"然后我可以声明它是仿函数的一个实例。但如果我这样做有什么好处呢?
这可能是一个非常愚蠢的问题,但我仍在努力进入功能编程领域。
答案 0 :(得分:6)
这一点与在OO编程中使用任何有用的抽象接口的要点基本相同;所有已经存在的代码在该界面方面做了有用的事情现在适用于您的新类型。
没有任何迹象表明你已经制作了Monad的任何实例,并且它不会让你真正做任何你不能做的事情。无论如何。但是,如果你不这样做,实际上保证你编写的一些代码实际上会重新实现与在任何 monad上运行的现有代码相同的东西;可能你会在没有意识到的情况下这样做。
如果您对Monad界面不是非常熟悉/自信,那么识别这种冗余并将其删除可能比编写重复代码更省力。但是如果你确实获得了这种熟悉度,那么发现可能是Monads的东西变得相当自然,就像发现你要写的代码一样,可以用现有的Monad代码代替。同样,这与OO语言中通用的抽象接口非常相似;主流OO语言往往缺乏表达一般monad概念所必需的类型系统特性,因此它不是许多OO程序员已经熟悉的那个。与编程中的任何内容一样,获得熟悉程度的最佳方法是只使用它一段时间,然后偶然发现这一段时间,所有事情都需要更长的时间,而不是以其他方式熟悉它。
Monad只是一个非常有用的界面。 Monads在Haskell中特别有用,因为它们已被社区接受为标准,因此现有库代码的很多可以与它们一起使用。但对他们来说真的没有什么比这更神奇了。