简短问题:同构函数在编程中的重要性是什么(即在函数式编程中)?
很长的问题:我试图根据我不时听到的一些术语,在类别理论中绘制函数式编程和概念之间的一些类比.从本质上讲,我正在尝试将该术语"解包"成具体的东西然后我可以扩展.然后,我将能够使用该术语,理解我正在谈论的那些 - 我正在谈论什么.这总是很好.
我一直听到的这些术语之一是同构,我收集的是关于函数或函数组合之间等价的推理.我想知道是否有人可以提供一些常见模式的一些见解,其中同构的属性派上用场(在函数式编程中),以及获得的任何副产品,例如从同构函数推理的编译器优化.
我想知道这些操作之间有什么区别.我在Stack Overflow中看到了类似的问题,但它们是关于Lisp的,并且没有三个运算符之间的比较.所以,如果已经提出这个问题,请告诉我.
我在Scheme中编写不同类型的命令,我得到以下输出:
(eq? 5 5) -->#t
(eq? 2.5 2.5) -->#f
(equal? 2.5 2.5) --> #t
(= 2.5 2.5) --> #t
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么会这样吗?
对于所有了解lambda演算的人:在编程方面它给你带来了什么好处?你会建议人们学习吗?
math computer-science functional-programming lambda-calculus
有没有办法比较两个函数的相等性?例如,(?x.2*x) == (?x.x+x)应该返回true,因为那些显然是等价的.
我对函数式编程中使用的monad和箭头的概念非常熟悉.我也明白它们可以用来解决类似的问题.
但是,对于如何选择在任何给定情况下使用哪一个,我仍然有点困惑.
我什么时候应该使用monads?什么时候应该使用箭头?
language-agnostic monads haskell functional-programming arrows
我有以下段落的问题来自Learn You A Haskell(伟大的书imo,而不是贬低它):
一个很大的区别是右侧折叠在无限列表上工作,而左侧折叠不起作用!说白了,如果你在某个点拿一个无限列表并从右边折叠起来,你最终会到达列表的开头.但是,如果你在一个点上获得一个无限的列表,并且你试图从左边折叠起来,那么你永远不会达到目的!
我只是不明白这一点.如果你拿一个无限的列表并试图从右边折叠起来那么你将不得不从无穷远点开始,这就是没有发生(如果有人知道你能做到这一点的语言,请告诉:p ).至少,你必须根据Haskell的实现开始那里,因为在Haskell中,foldr和foldl不会采用一个参数来确定列表中应该开始折叠的位置.
我同意引用iff foldr和foldl接受确定列表中应该开始折叠的位置的参数,因为有意义的是,如果你采用无限列表并从定义的索引开始向右折叠它最终将终止,而它不会无论你从哪里开始左折; 你将向无限折叠.但是,foldr和foldl 不接受这个参数,因此引用没有意义.在Haskell中,无限列表上的左侧折叠和右侧折叠都不会终止.
我的理解是正确的还是我错过了什么?
在大学的第二年,我们被"教"了Haskell,我对它几乎一无所知,更不用说函数式编程了.
什么是函数式编程,为什么和/ xor我想在哪里使用它而不是非函数式编程?我认为C是非函数式编程语言是正确的吗?
你什么时候不想使用函数式编程?什么不太擅长?
我更多地寻找范式的缺点,而不是"没有广泛使用"或"没有好的调试器可用"之类的东西.到目前为止,这些答案可能是正确的,但它们处理FP是一个新概念(一个不可避免的问题)而不是任何固有的品质.
有关:
我是Scala程序员,现在正在学习Haskell.很容易找到OO概念的实际用例和现实世界的例子,例如装饰器,策略模式等.书籍和互联网都充满了它.
我开始意识到这在某种程度上不是功能概念的情况.例证:申请人.
我正在努力寻找应用程序的实际用例.到目前为止,我遇到的几乎所有教程和书籍都提供了[]和的示例Maybe.我希望应用程序比这更适用,看到他们在FP社区中得到的所有关注.
我认为我理解申请人的概念基础(也许我错了),而且我已经等待了很长一段时间的启蒙.但它似乎并没有发生.从来没有在编程的时候,我有一个时刻,我会高兴地喊,"尤里卡!我可以在这里使用应用程序!" (再次,除了[]和Maybe).
有人可以指导我如何在日常编程中使用应用程序吗?如何开始发现模式?谢谢!
我一直在阅读许多文章试图理解功能和逻辑编程之间的区别,但到目前为止我能够做出的唯一推论是逻辑编程通过数学表达式定义程序.但是这样的事情与逻辑编程无关.
我真的很感激功能和逻辑编程之间的差异.