是否存在任何类似的List/Sequence map并提供元素的索引?
大多数源将纯函数定义为具有以下两个属性:
这是与我有关的第一个条件。在大多数情况下,很容易判断。考虑以下JavaScript函数(如本文所示)
纯:
const add = (x, y) => x + y;
add(2, 4); // 6
Run Code Online (Sandbox Code Playgroud)
不纯:
let x = 2;
const add = (y) => {
return x += y;
};
add(4); // x === 6 (the first time)
add(4); // x === 10 (the second time)
Run Code Online (Sandbox Code Playgroud)
不难看出,第二个函数将为后续调用提供不同的输出,从而违反了第一个条件。因此,这是不纯的。
这部分我明白了。
现在,对于我的问题,考虑以下函数,该函数将给定的美元金额转换为欧元:
(编辑- const在第一行中使用。let较早地使用。)
const exchangeRate = fetchFromDatabase(); // evaluates to say 0.9 for today;
const dollarToEuro = (x) => {
return …Run Code Online (Sandbox Code Playgroud) 在F#中,使用管道前向运算符|>非常常见.但是,在Haskell中,我只见过使用过的函数组合(.).我知道它们是相关的,但是有没有一种语言原因在Haskell中没有使用管道转发,还是其他什么?
是否有一个中等大小的Clojure示例应用程序可以用作"最佳实践"示例,并且是一种很好的方法来查看这样的应用程序在代码和代码组织方面会是什么样子?Web应用程序对我来说特别有趣,但最重要的是该程序执行一些通常有用的东西(例如,博客,错误跟踪,CMS),而不是我从未在真实中实现过的数学世界(解决N-queens问题,模拟生命,生成Fibonacci序列,以及功能编程语言的常用功能).
谢谢!
Scala中是否有关于何时使用可变集合的val与使用带有不可变集合的var的指南?或者你真的应该用不可变的集合来瞄准val吗?
事实上,这两种类型的集合给了我很多选择,而且我常常不知道如何做出这种选择.
通过阅读这篇经典论文,我坚持认为是paramorphisms.不幸的是,该部分非常薄,维基百科页面没有说什么.
我的Haskell翻译是:
para :: (a -> [a] -> b -> b) -> b -> [a] -> b
para f base = h
where
h [] = base
h (x:xs) = f x xs (h xs)
Run Code Online (Sandbox Code Playgroud)
但我不认为 - 我对类型签名或期望的结果没有任何直觉.
什么是paramorphism,什么是行动中的一些有用的例子?
是的,我已经看过这些 问题了,但是它们并没有直接涵盖paramorphisms,只指向可能有用作为参考的资源,而不是学习资料.
recursion haskell functional-programming higher-order-functions
我是否可以使用任何标准库调用来对两个数组执行set操作,或者自己实现这样的逻辑(理想情况下尽可能功能和高效)?
问题分为两部分.第一个是概念性的.接下来在Scala中更具体地看待同一个问题.
我来自命令式编程背景(C++,Java).我一直在探索函数式编程,特别是Scala.
纯函数式编程的一些主要原则:
尽管现代JVM对于创建对象非常有效,并且垃圾收集对于短期对象来说非常便宜,但是最小化对象创建可能更好吗?至少在并发和锁定不是问题的单线程应用程序中.由于Scala是一种混合范例,如果需要,可以选择使用可变对象编写命令式代码.但是,作为一个花了很多年时间试图重用对象并最小化分配的人.我希望对那些甚至不允许这样的思想流派有一个很好的理解.
作为一个特例,我对本教程中的 代码片段感到有些惊讶6.它有一个Java版本的Quicksort,后面是一个整洁的Scala实现.
这是我尝试对实现进行基准测试.我没有做过详细的剖析.但是,我的猜测是Scala版本较慢,因为分配的对象数是线性的(每个递归调用一个).尾调用优化是否有可能发挥作用?如果我是对的,Scala支持自我递归调用的尾调用优化.所以,它应该只是帮助它.我正在使用Scala 2.8.
public class QuickSortJ {
public static void sort(int[] xs) {
sort(xs, 0, xs.length -1 );
}
static void sort(int[] xs, int l, int r) {
if (r >= l) return;
int pivot = xs[l];
int a = l; int b = r;
while (a <= b){
while (xs[a] <= pivot) a++;
while (xs[b] > pivot) …Run Code Online (Sandbox Code Playgroud) 我在twitter上看到了这个奇怪的JavaScript行为示例
['10','10','10','10','10'].map(parseInt)
Run Code Online (Sandbox Code Playgroud)
评估为
[10, NaN, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)
有人可以解释这种行为吗?我用铬和萤火虫验证了它
['10','10','10','10','10'].map(function(x){return parseInt(x);})
Run Code Online (Sandbox Code Playgroud)
正确返回10的数组作为整数.这是不正确使用map(),parseInt的错误还是其他什么?
为什么Scala和像Spark和Scalding这样的框架都有reduce和foldLeft?那么reduce和之间的区别是fold什么?
scala ×4
haskell ×2
javascript ×2
clojure ×1
collections ×1
composition ×1
f# ×1
fold ×1
function ×1
immutability ×1
java ×1
map ×1
recursion ×1
reduce ×1
scalding ×1
swift ×1