Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 箭头相对于函数的优势_Function_Haskell_Arrows - Fatal编程技术网

Function 箭头相对于函数的优势

Function 箭头相对于函数的优势,function,haskell,arrows,Function,Haskell,Arrows,与haskell中的正则函数相比,箭头有什么优势。他们能做什么功能不能。函数可以使用fmap映射到结构上。函数只是箭头的一个实例,这就像问“为什么要使用单子而不仅仅是,可能是” 当然,可以使用箭头执行的任何操作都可以通过函数来完成,因为Arrow(->)实例只能讨论函数的一小部分,即Arrow类型类中的内容。但是,arrows的实例比普通函数多,因此我们可以使用ssame函数对更复杂的类型进行操作 箭头很好,因为它们可以有比函数多得多的结构,当使用fmap遍历时,我们无法累积效果,比单子更具表现

与haskell中的正则函数相比,箭头有什么优势。他们能做什么功能不能。函数可以使用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