对不起,新手问题。 我意识到这里有几个关于什么是咖喱和部分应用function的问题,但是我在问他们是如何不同的。 作为一个简单的例子,这里是一个查找偶数的curry函数: def filter(xs: List[Int], p: Int => Boolean): List[Int] = if (xs.isEmpty) xs else if (p(xs.head)) xs.head :: filter(xs.tail, p) else filter(xs.tail, p) def modN(n: Int)(x: Int) = ((x % n) == 0) 所以你可以写下面的内容来使用它: val nums = List(1,2,3,4,5,6,7,8) println(filter(nums, modN(2)) 它返回: List(2,4,6,8) 。 但我发现我可以这样做同样的事情: def modN(n: Int, x: Int) = ((x % n) […]
我正在努力学习Haskell,而且我正在经历所有的基础知识。 但是现在我陷入了困境,试图让我的脑袋围绕着仿函数。 我读过“一个仿函数将一个类别转换成另一个类别”。 这是什么意思? 我知道有很多要问,但是任何人都可以给我一个简单的英语解释函子或者一个简单的用例吗?
devise/构造大型函数程序的好方法是什么,特别是在Haskell中? 我已经经历了一些教程(写自己的计划是我最喜欢的,真正的世界哈斯克尔秒) – 但大多数的程序是相对较小,单一目的。 此外,我不认为其中的一些是特别优雅的(例如,WYAS中的大量查找表)。 我现在想编写更大的程序,更多的移动部分 – 从各种不同的来源获取数据,清理,以各种方式处理数据,在用户界面中显示数据,坚持使用数据,通过networking进行通信等等。一个最好的结构,这样的代码是清晰的,可维护的,适应不断变化的需求? 有相当多的文献针对大面向对象的命令式程序来解决这些问题。 像MVC,devise模式等理念是实现广泛目标的体面处方,如OO风格的分离关注和可重用性。 另外,较新的命令式语言适合于“devise成长”的重构风格,在我的新手观点中,Haskell显得不太合适。 Haskell有没有相同的文献? function性程序devise(单子,箭头,应用等)中的外来控制结构动物园如何最好地用于此目的? 你可以推荐哪些最佳做法? 谢谢! 编辑(这是Don Stewart的回答): @dons提到:“Monads可以捕获types中的关键架构devise”。 我猜我的问题是:如何以纯粹的function语言思考关键的build筑devise? 考虑几个数据stream的例子,以及几个处理步骤。 我可以将数据stream的模块化parsing器编写成一组数据结构,并且可以将每个处理步骤作为纯函数来实现。 一个数据所需的处理步骤取决于其值和其他值。 一些步骤应该跟随像GUI更新或数据库查询的副作用。 什么是“正确”的方式来绑定数据和parsing步骤,以一个很好的方式? 人们可以写一个很大的函数来为各种数据types做正确的事情。 或者可以使用monad来跟踪到目前为止已经处理了什么,并且每个处理步骤从monad状态接下来需要的任何东西。 或者可以写很大程度上单独的程序和发送消息(我不太喜欢这个选项)。 他链接的幻灯片有一个东西我们需要的项目符号:“映射devise到types/function/类/单子的习语”。 成语是什么? 🙂
我需要将一个JavaScript数组分成n大小的块。 例如:给定这个数组 ["a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11", "a12", "a13"] 而一个n等于4,输出应该是这样的: [ ["a1", "a2", "a3", "a4"], ["a5", "a6", "a7", "a8"], ["a9", "a10", "a11", "a12"], ["a13"] ] 我知道这个问题的纯JavaScript 解决scheme ,但由于我已经使用underscore.js我想知道如果下划线提供了一个更好的解决scheme。 编辑: 我创build了一个jsPerftesting来检查下划线解决scheme的速度。
首先,我正在阅读的真实世界Haskell说永远不会使用foldl而是使用foldl' 。 所以我相信它。 但是我对什么时候使用foldr与foldl'朦胧。 虽然我可以看到他们在我面前的工作方式不同,但我太愚蠢地不明白什么时候“哪个更好”。 我想在我看来,应该使用哪一个并不重要,因为它们都会产生相同的答案(不是吗?)。 事实上,我以前使用这个构造的经验是来自Ruby的inject和Clojure的reduce ,它们似乎没有“左”和“右”版本。 (侧面问题:他们使用哪个版本?) 任何能够帮助像我这样智慧挑战的洞察力都将受到高度赞赏!
我有一个关于哪种风格是首选的问题:std :: bind Vs lambda in C ++ 0x。 我知道他们服务于某些不同的目的,但让我们举一个相交function的例子。 使用lambda : uniform_int<> distribution(1, 6); mt19937 engine; // lambda style auto dice = [&]() { return distribution(engine); }; 使用bind : uniform_int<> distribution(1, 6); mt19937 engine; // bind style auto dice = bind(distribution, engine); 我们应该select哪一个? 为什么? 假设比上述例子更复杂的情况。 ie一个人的优点和缺点是什么?
在不同的问题中,我发现了有关使用Monads (->)实例的注释,例如实现无点风格。 至于我,这太抽象了。 好的,我在(->)上看到了Arrow实例,在我看来, (->)可以用于实例符号中,但不能用于types声明中(这只会是另一个问题)。 有没有人使用(->)作为Monad的实例? 或者一个很好的链接? 对不起,如果这个问题可能已经在这里讨论过,但是search“ (->) Monad实例”会给你很多点击,因为你可以想象…因为几乎所有关于Haskell的问题都涉及(->)或者“Monad” 。
为什么Scala和Spark和foldLeft这样的框架同时具有reduce和foldLeft ? 那么reduce和fold什么区别呢?
到目前为止,我主要面向OO编程,并期待学习一种function性语言。 我的问题是: 你什么时候select面向对象的函数式编程? 函数式编程是一个更好的select,典型的问题定义是什么?
我一直在阅读很多关于封闭的内容,我想我理解他们,但是没有让自己和其他人蒙上阴影,我希望有人能够尽可能简洁清楚地解释封闭。 我正在寻找一个简单的解释,可能会帮助我了解我想要使用它们的位置和原因。