这里有没有人有任何有用的代码在python中使用reduce()函数?除了我们在示例中看到的通常的+和*之外,还有其他代码吗?
通过GvR 参考Python 3000中的reduce()命运
一段时间以来,我一直在寻找一个体面的Haskell指南,但是找不到一个看起来很有趣的内容和/或有意义的指南.
几年前我曾经接触过Haskell,但我记不起来了.我记得"啊哈!" - 当我终于得到它时感觉不可思议,玩起来真的很有趣,所以我想重新发现丢失的Haskell艺术.
我熟悉Ruby及其函数式编程技巧,所以我觉得我并非完全处于黑暗中.有链接吗?
我正在阅读函数式编程,我注意到许多文章都提到模式匹配是函数式语言的核心特性之一.
有人能为Java/C++/JavaScript开发人员解释这是什么意思吗?
使用代数数据类型表示haskell中的树或列表很容易.但是你会怎么用印刷术来表示图形呢?看来你需要有指针.我猜你可以有类似的东西
type Nodetag = String
type Neighbours = [Nodetag]
data Node a = Node a Nodetag Neighbours
Run Code Online (Sandbox Code Playgroud)
这是可行的.然而感觉有点脱钩; 结构中不同节点之间的链接并不真正"感觉"像列表中当前上一个和下一个元素之间的链接一样,或者树中节点的父节点和子节点之间的链接.我有一种预感,即在我定义的图形上进行代数操作会受到通过标签系统引入的间接级别的阻碍.
主要是这种怀疑的感觉和不雅的感觉使我提出这个问题.在Haskell中定义图形是否有更好/更优化的方式?或者我偶然发现了本质上坚硬/根本的东西?递归数据结构很好,但这似乎是另一回事.自引用数据结构,与树和列表的自引用方式不同.它就像列表和树在类型级别是自引用的,但是图形在值级别是自引用的.
那真正发生了什么?
haskell types functional-programming graph algebraic-data-types
免责声明:我现在只玩了一天Go,所以很有可能我错过了很多.
有没有人知道为什么在Go中没有真正支持generics/templates/whatsInAName?所以有一个泛型map,但是由编译器提供,而Go程序员不能编写自己的实现.尽管所有关于使Go尽可能正交的讨论,为什么我可以使用泛型类型但不创建新类型?
特别是在涉及函数式编程时,有lambda,甚至是闭包,但是对于缺少泛型的静态类型系统,我如何编写,以及通用的高阶函数,如filter(predicate, list)?好的,链接列表等可以interface{}牺牲类型安全性来完成.
由于对SO/Google的快速搜索没有透露任何见解,所以看起来像仿制药,如果有的话,将作为事后补充添加到Go.我确实相信Thompson比Java家伙更好,但为什么要保持泛型?或者他们是否有计划而尚未实施?
我已经做了一段时间的Web开发人员,并且最近开始学习一些函数式编程.像其他人一样,我在将这些概念应用于我的专业工作时遇到了一些重大问题.对我来说,主要原因是我看到FP之间保持无状态的目标之间的冲突似乎与我所做的大多数Web开发工作都与数据库密切相关的事实相矛盾,数据库是以数据为中心的.
有一件事,让我更富有成效开发商对事物的OOP侧像MyGeneration d00dads对于.NET,Class对象关系映射器的发现:: DBI对Perl,ActiveRecord的红宝石等,这让我走就走从整天编写插入和选择语句,并专注于作为对象轻松处理数据.当然,我仍然可以在需要它们的时候编写SQL查询,但是否则它在幕后很好地抽象出来.
现在,转向功能编程,好像有很多喜欢的链接FP Web框架的要求写了很多的样板SQL代码,在这个例子中.Weblocks似乎好一点,但它似乎用一种OOP的模型与数据的工作,并且仍然需要代码手动为每个表在数据库中写入这个例子.我想你使用一些代码生成来编写这些映射函数,但这似乎绝对不像lisp.
(注意我没有仔细查看Weblocks或Links,我可能只是误解了它们的使用方式).
所以问题是,对于Web应用程序的数据库访问部分(我认为相当大),或者需要与sql数据库接口的其他开发,我们似乎被迫关闭以下路径之一:
显然,这些选项似乎都不合理.是否找到了绕过这些问题的方法?这里真的有一个问题吗?
注意:我个人最熟悉FP前端的LISP,所以如果您想提供任何示例并了解多种FP语言,那么lisp可能是首选语言
PS:对于Web开发其他方面的特定问题,请参阅此问题.
试图学习F#,但在尝试区分折叠和减少时感到困惑.折叠似乎做同样的事情,但需要额外的参数.是否存在这两种功能存在的合理原因,或者它们是否适合具有不同背景的人?(例如:C#中的字符串和字符串)
以下是从示例中复制的代码段:
let sumAList list =
List.reduce (fun acc elem -> acc + elem) list
let sumAFoldingList list =
List.fold (fun acc elem -> acc + elem) 0 list
printfn "Are these two the same? %A "
(sumAList [2; 4; 10] = sumAFoldingList [2; 4; 10])
Run Code Online (Sandbox Code Playgroud) 我一直想知道懒惰评估为何有用.我还没有任何人以有道理的方式向我解释; 最重要的是它最终沸腾到"相信我".
注意:我不是指记忆.
这是对我上一个问题的答案的后续跟进.
假设我需要映射每个项目a:A的List[A]来b:B使用功能def f(a:A, leftNeighbors:List[A]): B和产生List[B].
显然,我不能只是map在列表上调用,但我可以使用列表拉链.拉链是一个在列表中移动的光标.它提供对当前element(focus)及其邻居的访问.
现在我可以替换我f的 def f'(z:Zipper[A]):B = f(z.focus, z.left)并将这个新函数传递f'给cobind方法Zipper[A].
这样的cobind工作:它f'用拉链调用,然后移动拉链,f'用新的 "移动"拉链调用,再次移动拉链等等......直到拉链到达列表的末尾.
最后,cobind返回一个新的拉链类型Zipper[B],可以将其转换为列表,从而解决问题.
现在请注意之间的对称性cobind[A](f:Zipper[A] => B):Zipper[B]和bind[A](f:A => List[B]):List[B]这就是为什么List是Monad和Zipper是Comonad.
是否有意义 ?
我真的很难理解程序和函数编程范例之间的区别.
以下是维基百科关于函数式编程的前两段:
在计算机科学中,函数式编程是一种编程范式,它将计算视为数学函数的评估,并避免状态和可变数据.它强调功能的应用,与强调状态变化的命令式编程风格形成对比.函数式编程的根源在于lambda演算,这是一种在20世纪30年代开发的用于研究函数定义,函数应用和递归的正式系统.许多函数式编程语言可以被视为lambda演算的详细说明.
在实践中,数学函数与命令式编程中使用的"函数"概念之间的区别在于命令式函数可能具有副作用,从而改变程序状态的值.因此,它们缺乏参照透明度,即相同的语言表达式可能在不同的时间导致不同的值,这取决于执行程序的状态.相反,在函数代码中,函数的输出值仅取决于输入到函数的参数,因此
f使用相同的参数值调用函数 两次x将产生相同的结果f(x).消除副作用可以更容易理解和预测程序的行为,这是开发函数式编程的关键动机之一.
在第2段中,它说
相反,在函数代码中,函数的输出值仅取决于输入到函数的参数,因此
f使用相同的参数值调用函数两次x将产生相同的结果f(x).
程序编程的情况不一样吗?
什么应该在程序性和功能性中脱颖而出?
procedural-programming programming-languages functional-programming