如何在Objective-C中编写lambda方法?
在大学的第二年,我们被“教”了Haskell,我对它几乎一无所知,甚至不了解函数式编程。 什么是函数式编程,为什么和/ xor我想在哪里使用它,而不是非函数式编程,我正确地认为C是一种非函数式编程语言?
我是Haskell的新手,我正在阅读函数和应用函子。 好吧,我理解仿函数,我如何使用它们,但我不明白为什么应用仿函数是有用的,我怎样才能在Haskell中使用它们。 你能用一个简单的例子来解释我为什么需要应用函子吗?
我想知道是否有任何方式来拉动Java。 我认为,如果没有本地支持封锁,这是不可能的。
我一直在使用C ++进行函数式编程的基础知识。 我试图做一个函数f(a)(b)(c) ,将返回a + b + c 。 我成功实现了函数f(a)(b) ,它返回a + b。 这是它的代码: std::function<double(double)> plus2(double a){ return[a](double b){return a + b; }; } 我只是不知道如何实现函数f(a)(b)(c) ,正如我以前所说,应该返回a + b + c 。
我有一个问题,从学习你一个Haskell (伟大的书,不要dising它)以下的段落: 一个很大的区别是,正确的折叠在无限的列表上工作,而左边的不是! 说白了,如果你在某个时候拿出一个无限的列表,而你从右侧折叠起来,你最终会到达列表的开头。 但是,如果你在一个点上有一个无限的列表,而你试图从左边折叠它,那么你将永远无法达到目的! 我只是不明白这一点。 如果你有一个无限的列表,试着把它从右边折叠起来,那么你将不得不从无穷远处开始,这是不会发生的(如果有人知道你可以做到这一点的语言, )。 至less,根据Haskell的实现,你必须从Haskell的实现开始,因为在Haskell中,foldr和foldl不会接受一个参数来确定列表中哪些位置应该开始折叠。 我会同意这个引用iff foldr和foldl接受了一个参数来确定列表中他们应该开始折叠的位置,因为如果你从一个已定义的索引中取出一个无限的列表并开始折叠, 它将最终终止,不pipe你从哪里开始, 你会向无穷大折叠。 然而,foldr和foldl 并不认为这个论点,因此这个引用是毫无意义的。 在Haskell中,无限列表中的左alignment和右alignment都不会终止 。 我的理解是正确的还是我错过了什么?
我将要以分散的结构教授一门低级课程。 我select了离散结构,逻辑和可计算性的教科书,部分原因是它包含有助于用函数式编程语言实现的示例和概念。 (我也认为这是一本很好的教科书。) 我想要一个易于理解的FP语言来说明DS的概念,并且学生可以使用。 充其量,大多math生在Java中只有一到两个学期的程序devise。 看过Scheme,Erlang,Haskell,Ocaml和SML之后,我已经select了Haskell或Standard ML。 我倾向于Haskell出于下面列出的原因,但我希望那些积极的程序员的意见,在一个或另一个。 Haskell和SML都有模式匹配,这使得描述recursionalgorithm变得简单。 哈斯克尔有很好的列表理解,很好地匹配这样的列表在math上expression。 Haskell有懒惰的评价。 非常适合使用列表理解技术构build无限列表。 SML有一个真正的交互式解释器,可以在其中定义和使用函数。 在Haskell中,函数必须在单独的文件中定义并在交互式shell中使用之前进行编译。 SML以一种容易理解的语法给出了函数参数和返回types的明确确认。 例如:val foo = fn:int * int – > int。 哈斯克尔的隐含的咖喱语法更为呆板,但并不完全陌生。 例如:foo :: Int – > Int – > Int。 Haskell默认使用任意精度的整数。 这是SML / NJ的外部图书馆。 SML / NJ会将输出截断为70个字符。 Haskell的lambda语法是微妙的 – 它使用一个反斜杠。 SML更加明确。 不知道我们是否需要这门课的lambda。 本质上,SML和Haskell大致相同。 我倾向于Haskell,因为我喜欢Haskell中的列表理解和无限列表。 但是我担心Haskell的紧凑语法中大量的符号可能会导致学生的问题。 从我读过的其他文章中可以看出,Haskell不推荐用于FP的初学者。 但是我们不打算构build完整的应用程序,只是尝试简单的algorithm。 你怎么看? 编辑:在阅读你的一些很好的回应,我应该澄清我的一些要点。 在SML中,在解释器中定义函数和在外部文件中定义函数之间没有语法上的区别。 假设你想写出阶乘函数。 […]
对于所有了解lambda微积分的人来说:它给你带来了什么好处,关于编程? 你会build议人们学习吗?
什么是尽早终止弃牌的最好方法? 作为一个简单的例子,想象一下我想总结一个Iterable的数字,但是如果遇到我不期待的事情(比如奇数),我可能想要终止。 这是第一个近似值 def sumEvenNumbers(nums: Iterable[Int]): Option[Int] = { nums.foldLeft (Some(0): Option[Int]) { case (Some(s), n) if n % 2 == 0 => Some(s + n) case _ => None } } 然而,这个解决scheme是相当丑陋的(比如,如果我做了一个.foreach和一个返回 – 它会更清晰和更清晰),最糟糕的是,它遍历整个迭代,即使遇到一个非偶数。 那么写这样一个折叠的最好方法是什么? 我应该去recursion地写这个,还是有一个更可接受的方法?
我已经一次又一次地听到了,我正试图理解和validationFP和OO是正交的。 首先,两个概念是正交的意味着什么? FP鼓励尽可能的不变性和纯洁性,而OO似乎是为了状态和变异而build立的 – 一个稍微有组织的命令式编程版本? 我意识到对象可以是不可改变的,但是OO似乎意味着对我的状态/改变。 他们看起来像对立面。 这如何影响它们的正交性? 像Scala这样的语言可以很容易地做OO和FP,这是否会影响两种方法的正交性?