Function 箭头相对于函数的优势
与haskell中的正则函数相比,箭头有什么优势。他们能做什么功能不能。函数可以使用fmap映射到结构上。函数只是箭头的一个实例,这就像问“为什么要使用单子而不仅仅是Function 箭头相对于函数的优势,function,haskell,arrows,Function,Haskell,Arrows,与haskell中的正则函数相比,箭头有什么优势。他们能做什么功能不能。函数可以使用fmap映射到结构上。函数只是箭头的一个实例,这就像问“为什么要使用单子而不仅仅是,可能是” 当然,可以使用箭头执行的任何操作都可以通过函数来完成,因为Arrow(->)实例只能讨论函数的一小部分,即Arrow类型类中的内容。但是,arrows的实例比普通函数多,因此我们可以使用ssame函数对更复杂的类型进行操作 箭头很好,因为它们可以有比函数多得多的结构,当使用fmap遍历时,我们无法累积效果,比单子更具表现
,可能是”
当然,可以使用箭头执行的任何操作都可以通过函数来完成,因为Arrow(->)
实例只能讨论函数的一小部分,即Arrow
类型类中的内容。但是,arrows的实例比普通函数多,因此我们可以使用ssame函数对更复杂的类型进行操作
箭头很好,因为它们可以有比函数多得多的结构,当使用fmap
遍历时,我们无法累积效果,比单子更具表现力!考虑克里斯利箭头,
newtype Kleisli m a b = Kleisli {runKleisli :: a -> m b}
当m
是单子时,这会形成一个箭头。所以每个Monad
都会形成一个箭头,因此我们可以通过无缝组合a->mb
来构建一元计算,并做各种有用的事情。一些XML库使用箭头将函数从元素抽象到其子元素,并使用箭头遍历文档。其他解析器使用箭头(它们最初的用途),尽管现在这似乎不受Applicative
的欢迎
希望您注意到的一点是,箭头更通用,当我们只讨论箭头时,我们避免重复使用解析器、xml刮取器和一元函数所需编写的所有代码
这就像选择Monad
而不是也许
,我们失去了一些力量,因为我们不再能够做出具体的陈述,但我们得到了更多的通用代码作为回报。从更广泛的角度来看,箭头可以让你走出Hask,进入其他需要探索的领域。哈斯凯勒可能最熟悉克莱斯利分类,其次是。这些是Hask的自然“扩展”:在结果或参数周围添加一个内函子,如果
Kleisli
:函子是单子,所以id≅ return::a->ma
(.) ≅ (<=<) :: (b->m c) -> (a->m b) -> a->m c
(因此,您不需要Arrow
,只需要Category
。但是一般的类别不是很有趣,您通常需要单倍体甚至笛卡尔闭式类别,这正是Arrow
的大致目标。)
但是肯定有很多。大多数对象与Hask没有太多关系,也不能用标准的Arrow
类来表示,这主要是因为对象具有并非每个Haskell类型都能满足的特殊属性。实际上,如果添加约束对象类型的功能。但是,即使您使用标准类,甚至可能只是在->
中,使用箭头的自然无点构图风格通常非常漂亮、简洁,并为思考转换开辟了新的途径
(.) :: (m b->c) -> (m a->b) -> m a->c