我知道我来晚了,但是您在这里有两个理论上的答案,我想提供一种可行的替代方法。我是作为Haskell noob的一个相对亲戚来的,尽管如此,他最近还是在我正在进行的一个项目上通过了Arrows的主题前进。
首先,您可以高效地解决Haskell中的大多数问题,而无需接触Arrows。一些著名的Haskellers确实不喜欢也不使用它们(有关此问题的更多信息,请参见此处,此处和此处)。因此,如果您对自己说“嘿,我不需要这些”,请了解您可能确实是正确的。
当我第一次学习箭时,最令我沮丧的是关于该主题的教程如何不可避免地达到电路的类比。如果您查看箭头代码-至少是加糖的代码-它与硬件定义语言没有什么相似之处。您的输入在右侧排列,您的输出在左侧,如果您未能正确地将它们全部连接起来,它们将无法启动。我对自己想:是吗?这是我们结束的地方吗?我们是否创建了一种完全高级的语言,使其再次由铜线和焊料组成?
据我所能确定的,正确的答案是:实际上,是的。现在,Arrows的杀手级用例是FRP(通常认为Yampa,游戏,音乐和反应系统)。FRP面临的问题与所有其他同步消息传递系统面临的问题大致相同:如何将连续的输入流连接到连续的输出流中,而又不会丢失相关信息或出现泄漏。您可以将流建模为列表-最近的几种FRP系统都使用这种方法-但是,当您有很多输入时,列表几乎变得无法管理。您需要将自己与当前隔离。
Arrows在FRP系统中所允许的是将功能组合到网络中,同时完全抽象出对那些功能所传递的基础值的任何引用。如果您不熟悉FP,一开始可能会感到困惑,而在您了解FP的含义之后却会令人不解。您直到最近才吸收了可以抽象函数的想法,以及如何理解[(*), (+), (-)]
类型为type 的列表[(a -> a -> a)]
。使用Arrows,您可以将抽象进一步推进一层。
这种附加的抽象能力带有其自身的危险。一方面,它可以将GHC推入极端情况,在这种情况下,它不知道如何根据您的类型假设做出决定。您必须准备好在类型级别上进行思考-这是学习种类和RankNTypes以及其他此类主题的绝佳机会。
还有许多我称之为“愚蠢的箭头特技”的示例,在此代码中,编码器到达某个箭头组合器只是因为他或她想展示一个元组的整洁技巧。(这是我对疯狂的微不足道的贡献。)当您在野外遇到它时,可以随意忽略这种热狗。
注意:如上所述,我是一个相对的菜鸟。如果我在上面发布了任何误解,请随时纠正我。