Tag: 函数编程

如何使用lodash中的includes方法来检查对象是否在集合中?

lodash让我检查基本数据types的成员includes : _.includes([1, 2, 3], 2) > true 但以下不起作用: _.includes([{"a": 1}, {"b": 2}], {"b": 2}) > false 这使我感到困惑,因为通过集合进行search的以下方法似乎做得很好: _.where([{"a": 1}, {"b": 2}], {"b": 2}) > {"b": 2} _.find([{"a": 1}, {"b": 2}], {"b": 2}) > {"b": 2} 我究竟做错了什么? 如何使用includes检查集合中对象的成员身份? 编辑:问题最初是为lodash版本2.4.1,更新为lodash 4.0.0

什么,如果有的话,这个洗牌algorithm是错误的,我怎么知道?

就像背景一样,我知道Fisher-Yates完美的洗牌。 O(n)的复杂性和保证的一致性是一个很好的洗牌,我不会使用它…在允许数组就地更新的环境中(所以在大多数情况下,即使不是全部, 命令式编程环境)。 可悲的是function性编程世界并不能让你进入可变状态。 然而,由于Fisher-Yates,关于如何devise一个洗牌algorithm,并没有太多的文献可以find。 事实上,几乎没有一个地方可以这样说,“所以这里就是你需要知道的所有洗牌的费希尔 – 耶茨。 最后,我必须拿出我自己的解决scheme。 我想出了这样的解决scheme来洗牌任何数据列表: 如果列表为空,则返回空集。 如果列表中有单个项目,则返回该单个项目。 如果列表不是空的,则用随机数生成器对列表进行分区,并recursion地将algorithm应用于每个分区,然后组装结果。 在Erlang代码中,它看起来像这样: shuffle([]) -> []; shuffle([L]) -> [L]; shuffle(L) -> {Left, Right} = lists:partition(fun(_) -> random:uniform() < 0.5 end, L), shuffle(Left) ++ shuffle(Right). (如果这看起来像一个疯狂的快速sorting,那么基本上就是这样。) 所以这就是我的问题:寻找不是Fisher-Yates的混洗algorithm的相同情况使得寻找工具来分析洗牌algorithm同样困难。 在分析PRNG的一致性,周期性等方面,我可以find许多文献,但是关于如何分析洗牌的信息却并不多。 (事实上​​,我在分析洗牌时发现的一些信息显然是错误的 – 很容易通过简单的技术欺骗。) 所以我的问题是:我如何分析我的洗牌algorithm(假设random:uniform()调用那里有产生具有良好特性的适当随机数的任务)? 我可以用什么math工具来判断,在1..100的整数列表中,是否有100,000次洗牌机运行给了我合理的洗牌结果? 我已经做了一些我自己的testing(例如比较增量在shuffles中的递减),但我想知道更多。 如果有什么洞察到洗牌algorithm本身,也将不胜感激。

直觉型理论的组合逻辑等价物是什么?

我最近完成了一门以Haskell和Agda(一种依赖types的函数式编程语言)为特色的大学课程,并且想知道是否可以用组合逻辑来替代这些中的lambda演算。 对于Haskell来说,使用S和K组合器似乎是可能的,从而使其不存在任何问题。 我想知道Agda的等价物是什么。 也就是说,能不能使用任何variables就可以生成一个与Agda相当的函数式编程语言? 另外,是否有可能以某种方式取代组合器的量化? 我不知道这是否是巧合,但是例如通用量化使得types签名看起来像一个lambdaexpression式。 有没有办法从types签名中去除通用量化而不改变其含义? 例如: forall a : Int -> a < 0 -> a + a < a 同样的事情可以不使用forall来expression吗?

数据库和函数式编程有何不同?

我已经有了一段时间的Web开发人员,并且最近开始学习一些函数式编程。 和其他人一样,我将这些概念中的很多应用到我的专业工作上,都遇到了很大的麻烦。 对我来说,主要原因是我看到FP之间的剩余无状态目标之间的冲突似乎与我所做的大多数Web开发工作已严重依赖于数据库,这是非常以数据为中心的事实相冲突。 有一件事让我成为OOP方面更有成效的开发者,就是发现了MyGeneration d00dads for .NET,Class :: DBI for perl,ActiveRecord for ruby​​等对象关系映射器。这使我可以远离从写插入和select语句整天,并专注于作为对象容易地处理数据。 当然,我们仍然可以在需要权限时编写SQL查询,但是在幕后很好地抽象出来。 现在,转向function性编程,就像在这个例子中 ,像Links这样的许多FP Web框架似乎需要编写大量的样板化sql代码。 networking锁看起来好一点,但它好像使用了一种OOP模型来处理数据,并且仍然需要为数据库中的每个表手动编写代码,如本例中所示 。 我想你使用了一些代码生成来编写这些映射函数,但是这看起来好像是一个不假思索的样子。 (请注意,我没有非常仔细地查看Weblocks或Links,我可能会误解它们是如何使用的)。 所以问题是,对于Web应用程序的数据库访问部分(我相信这是相当大的),或者其他需要与sql数据库接口的开发,我们似乎被迫下了以下path之一: 不要使用函数式编程 以恼人的,不抽象的方式访问数据,涉及手动编写大量SQL或类似SQL的代码ala链接 强制我们的function性语言变成伪OOP范例,从而消除了真正的函数式编程的一些优雅和稳定性。 显然,这些select都不是理想的。 是否find了解决这些问题的方法? 这里真的有一个问题吗? 注意:我个人最熟悉FP前端的LISP,所以如果你想给出任何例子并且知道多种FP语言,lisp可能是首选的语言select PS:有关Web开发其他方面的问题,请参阅此问题 。

懒洋洋地产生排列

我正在寻找一种algorithm来生成一个集合的排列,这样我就可以在Clojure中创build一个懒惰的列表。 即我想迭代一个排列列表,其中每个排列不被计算,直到我请求它,所有的排列不必一次存储在内存中。 另外,我正在寻找一个给定一个集合的algorithm,它将返回该集合的“下一个”排列,以这种方式重复调用自己的输出函数将循环所有排列的原始集合,在有些命令(顺序是什么并不重要)。 有这样一个algorithm吗? 我所看到的大部分排列生成algorithm倾向于一次生成它们(通常是recursion的),这不会扩展到很大的集合。 在Clojure(或其他function语言)中的实现将是有益的,但我可以从伪代码中找出它。

什么是类的选项?

我无法理解Scala中的Option[T]类。 我的意思是,我无法看到任何超过null 。 例如,考虑下面的代码: object Main{ class Person(name: String, var age: int){ def display = println(name+" "+age) } def getPerson1: Person = { // returns a Person instance or null } def getPerson2: Option[Person] = { // returns either Some[Person] or None } def main(argv: Array[String]): Unit = { val p = getPerson1 if (p!=null) […]

在PHP中查找数组的子集

我有一个具有属性的关系模式(ABCD)。 我也有一套function依赖关系。 现在我需要确定R的属性的所有可能的子集的闭包。 那就是我卡住的地方。 我需要学习如何在PHP中查找子集(非重复)。 我的数组像这样存储。 $ATTRIBUTES = ('A', 'B', 'C', 'D'). 所以我的子集应该是 $SUBSET = ('A', 'B', 'C', 'D', 'AB', 'AC', AD', 'BC', 'BD', 'CD', 'ABC', 'ABD', 'BCD', 'ABCD') 代码不应该是大的,但由于某种原因,我不能得到我的头。

Uncaught TypeError:在JavaScript中非法调用

我创build了一个lambda函数,用一个具体的参数来执行第二个函数。这个代码在Firefox中工作,但不在Chrome中,它的检查器显示一个奇怪的错误, Uncaught TypeError: Illegal invocation 。 我的代码有什么问题? var make = function(callback,params){ callback(params); } make(console.log,'it will be accepted!');