在哪种情况下,我应该选择使用函数式编程语言而不是更简洁的面向对象语言,如C++,C#或Java?
我理解什么是函数式编程,我真正理解的是什么类型的问题是一个完美的解决方案?
我只是在C++中错误地做了类似的事情,并且它有效.我为什么要这样做?
int main(int argc, char** argv) {
struct MyStruct
{
int somevalue;
};
MyStruct s;
s.somevalue = 5;
}
Run Code Online (Sandbox Code Playgroud)
在做完这个之后,我记得很久以前在某个地方读过这个技巧,作为一种穷人用于C++的函数式编程工具,但我不记得为什么这个有效,或者我读到它.
欢迎回答任何一个问题!
注意:虽然在写这个问题时我没有得到任何关于这个问题的引用,但是当前的侧边栏指出了它,所以我会把它放在这里供参考,无论哪种方式问题都不同但可能有用.
我想压缩以下列表列表:
>>> zip([[1,2], [3,4], [5,6]])
[[1,3,5], [2,4,6]]
Run Code Online (Sandbox Code Playgroud)
zip只有将列表拆分为单个组件时,才能通过当前实现实现此目的:
>>> zip([1,2], [3,4], [5,6])
(1, 3, 5), (2, 4, 6)]
Run Code Online (Sandbox Code Playgroud)
无法弄清楚如何拆分列表并将各个元素传递给zip.功能性溶液是优选的.
标准库的Haskell类型类MonadPlus,Alternative以及Monoid各自提供两种方法具有基本相同的语义:
mzero,empty或mempty.a -> a -> a,在类型类联接值加在一起:mplus,<|>或mappend.所有这三个都规定了应遵守的法律:
mempty `mappend` x = x
x `mappend` mempty = x
Run Code Online (Sandbox Code Playgroud)
因此,似乎三个类型都提供相同的方法.
(Alternative也提供some和many,但它们的默认定义通常是足够的,所以它们在这个问题上并不太重要.)
所以,我的疑问是:为什么这三个极为相似的类?除了不同的超类限制之外,它们之间是否有任何真正的区别?
haskell functional-programming typeclass applicative monoids
可能重复:
什么是monad?
我想我明白'也许莫纳德'是什么,但我不确定其他类型.
什么是提前终止折扣的最佳方式?作为一个简化的例子,想象一下,我想总结一下数字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
}
}
Run Code Online (Sandbox Code Playgroud)
然而,这个解决方案非常难看(如果我做了.foreach和返回 - 它会更清晰和更清晰),最糟糕的是,它遍历整个迭代,即使它遇到非偶数.
那么编写像这样的折叠最好的方法是什么呢?我应该去递归地写这个,还是有一个更被接受的方式?
我一直在阅读很多关于闭包的内容,我认为我理解它们,但是没有为自己和他人蒙上阴影,我希望有人可以尽可能简洁明了地解释闭包.我正在寻找一个简单的解释,可以帮助我理解我想要使用它们的地点和原因.
我是斯蒂芬·沃尔夫勒姆(Stephen Wolfram)的忠实粉丝,但他绝对不会羞于吹响自己的号角.在许多参考文献中,他将Mathematica称为不同的符号编程范例.我不是Mathematica用户.
My questions are: what is this symbolic programming? And how does it compare to functional languages (such as Haskell)?
haskell programming-languages functional-programming wolfram-mathematica
有人可以向我解释功能性镜片吗?谷歌这是一个令人惊讶的困难主题,我没有取得任何进展.我所知道的是,它们提供了类似于OO的获取/设置功能.
我需要将JavaScript数组拆分为n大小的块.
例如:给定这个数组
["a1", "a2", "a3", "a4", "a5", "a6", "a7", "a8", "a9", "a10", "a11", "a12", "a13"]
Run Code Online (Sandbox Code Playgroud)
和a n等于4,输出应为:
[ ["a1", "a2", "a3", "a4"],
["a5", "a6", "a7", "a8"],
["a9", "a10", "a11", "a12"],
["a13"]
]
Run Code Online (Sandbox Code Playgroud)
我知道这个问题的纯JavaScript 解决方案,但由于我已经在使用Underscore.js,我想知道下划线是否为此提供了更好的解决方案.
我创建了一个jsPerf测试来检查下划线解决方案的速度有多慢.
javascript split functional-programming underscore.js lodash