haskell中的箭头和函数有何不同?

mag

我花了一段时间学习和搜索了Arrows,但对Arrow类的必要性感到有些困惑。据我所知,Arrow类是函数的抽象,而ArrowA a b c表示某种东西需要b类型的输入和c类型的输出。此外,它提供了像一些基本的操作>>>arrfirst

但是,我找不到type的标准函数和type的b -> cArrow之间的任何区别A a b c在我看来,first>>>可以通过更换\(b, c) -> (f b, c),和(.)另外,由于箭头内部的每个计算都由函数表示,因此如果我们用这些函数替换箭头,我认为不会有任何区别。

简而言之,我认为Arrows计算图的每个节点(类似于https://www.haskell.org/arrows/syntax.html中的节点)都可以由Haskell的标准函数代替。如果是真的,为什么我们使用Arrow而不是函数?

彼得

遵循某些定律抽象使您可以进行通用编程。您可以在没有任何类型类的情况下进行编程(没有monad,应用程序,没有等式/顺序等),但这将非常不便,因为您将无法编写利用这些属性的通用代码。

就像您说不想使用该Ord实例一样,然后您必须为Set可以订购的每种数据类型分别重写实现

的要点Arrow是描述计算

  • 接受输入
  • 产生输出,并且
  • 中间要有确定性(效果是口语表达)。

因此,箭头A b c不是函数a -> b箭头最有可能在内部作为一种功能实现,但更为复杂,实现该Arrow界面的目的是(除其他外)描述它们的组成方式。

专门针对箭头,您可以使用箭头符号来对任何有效的使用相同的符号Arrow举个例子,在netwire包中,Wire数据类型实现了Arrow,因此您可以使用箭头符号,以及在箭头上起作用的所有实用程序功能。没有实例,您将必须具有特定于netwire的语法,或者仅使用netwire提供的功能。

举个例子:与Statemonad对应的箭头a -> s -> (b, s)但是两个这样的函数不能用组合(.)您需要描述它们的组成,而事实恰恰是Arrow这样。


更新:可能存在多种可组合性概念,但我想您的意思是类似函数的组合。是的,这种可组合性来自ArrowCategory超类,该超类定义了身份和组成。

我最近从中了解到,另一部分Arrow来自于Strong发音器。发音器和箭头之间的关系是什么?(尽管在type-class层次结构中未捕获到该值,因为Profunctortypeclass比年龄年轻Arrow)。Profunctors允许由纯计算从“双方”改性,见lmap/ rmap/dimapProfunctor对于箭头,我们有(<<^)(^>>),用arr>>>通过将bv左右的箭头与用构造的纯箭头组成arr

最后箭的力量为wrt (,),被俘获first :: Arrow a => a b c -> a (b, d) (c, d)这意味着我们只能在输入的一部分上使用箭头,而传递另一个不变的箭头。这样就可以用“平行线”构造“电路”,而不必first保存一部分计算的输出并在以后的某个地方使用它。

一个好的练习是绘制一个表示计算的电路,然后尝试使用Arrow基元/实用工具或使用箭头语法表示法来表示它您会看到first(或***)对于此至关重要。

有关操作的详细说明,请参见“箭头可以多任务处理”。

对于更多的理论背景,“箭是坚强的Monads”可能很有趣(我还没有读过)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

haskell中的箭头和函数有何不同?

来自分类Dev

普通函数和箭头函数在_proto_构造函数之间有何不同?

来自分类Dev

类和函数构造函数有何不同

来自分类Dev

Perl Cwd :: cwd和Cwd :: getcwd函数有何不同?

来自分类Dev

在Tkinter中,padx用作小部件内的参数和网格函数中的参数时有何不同?

来自分类Dev

/ **和/ *在Grunt中目录导航方面有何不同?

来自分类Dev

FlinkSQL中GROUP BY和OVER WINDOW有何不同?

来自分类Dev

Rust-内存中的“ String”和“ str”有何不同?

来自分类Dev

Mockito中的Return和toReturn有何不同?

来自分类Dev

Ruby中模块和类的用法有何不同?

来自分类Dev

在laravel 5.3中回声({!! ... !!}和{{...}})有何不同?

来自分类Dev

ChartObjects 和 TableRange 中的 beetwin Left 属性有何不同?

来自分类Dev

函数引用与Action <T>有何不同

来自分类Dev

这对JavaScript函数有何不同?

来自分类Dev

这些C函数有何不同?

来自分类Dev

[1 .. 0]与Haskell中的[1 .. -1]有何不同?为什么?

来自分类Dev

MAP成员函数与Oracle中的Object Type成员函数有何不同

来自分类Dev

MAP成员函数与Oracle中的Object Type成员函数有何不同

来自分类常见问题

抽象和封装有何不同?

来自分类Dev

Numpy和Matlab的总和有何不同?

来自分类Dev

127.0.0.1、0.0.0.0和localhost有何不同?

来自分类Dev

List和List <String>有何不同?

来自分类Dev

Haskell 函数签名中的等于箭头

来自分类Dev

WinAPI Shell API与基本API和CRT函数有何不同?

来自分类Dev

在构造函数内部创建的状态内部和外部状态定义的数据有何不同?

来自分类Dev

WinAPI Shell API与基本API和CRT函数有何不同?

来自分类Dev

在函数中调用列与在pandas数据框中在外部调用列有何不同?

来自分类Dev

为什么在 Haskell 中 flip 和 flip(:) 是不同的函数?

来自分类Dev

Java中的equals()与==有何不同

Related 相关文章

  1. 1

    haskell中的箭头和函数有何不同?

  2. 2

    普通函数和箭头函数在_proto_构造函数之间有何不同?

  3. 3

    类和函数构造函数有何不同

  4. 4

    Perl Cwd :: cwd和Cwd :: getcwd函数有何不同?

  5. 5

    在Tkinter中,padx用作小部件内的参数和网格函数中的参数时有何不同?

  6. 6

    / **和/ *在Grunt中目录导航方面有何不同?

  7. 7

    FlinkSQL中GROUP BY和OVER WINDOW有何不同?

  8. 8

    Rust-内存中的“ String”和“ str”有何不同?

  9. 9

    Mockito中的Return和toReturn有何不同?

  10. 10

    Ruby中模块和类的用法有何不同?

  11. 11

    在laravel 5.3中回声({!! ... !!}和{{...}})有何不同?

  12. 12

    ChartObjects 和 TableRange 中的 beetwin Left 属性有何不同?

  13. 13

    函数引用与Action <T>有何不同

  14. 14

    这对JavaScript函数有何不同?

  15. 15

    这些C函数有何不同?

  16. 16

    [1 .. 0]与Haskell中的[1 .. -1]有何不同?为什么?

  17. 17

    MAP成员函数与Oracle中的Object Type成员函数有何不同

  18. 18

    MAP成员函数与Oracle中的Object Type成员函数有何不同

  19. 19

    抽象和封装有何不同?

  20. 20

    Numpy和Matlab的总和有何不同?

  21. 21

    127.0.0.1、0.0.0.0和localhost有何不同?

  22. 22

    List和List <String>有何不同?

  23. 23

    Haskell 函数签名中的等于箭头

  24. 24

    WinAPI Shell API与基本API和CRT函数有何不同?

  25. 25

    在构造函数内部创建的状态内部和外部状态定义的数据有何不同?

  26. 26

    WinAPI Shell API与基本API和CRT函数有何不同?

  27. 27

    在函数中调用列与在pandas数据框中在外部调用列有何不同?

  28. 28

    为什么在 Haskell 中 flip 和 flip(:) 是不同的函数?

  29. 29

    Java中的equals()与==有何不同

热门标签

归档