例如,如果我开始学习Haskell,我可以find自己使用它。 我听说这种语言的一些常见用途是function性的吗?
我不得不承认,我对函数式编程知之甚less。 我从这里到那里读了一遍,所以知道在函数式编程中,无论调用多less次函数,函数都会返回相同的输出。 这与math函数完全相同,即对函数expression式中涉及的input参数的相同值进行相同的输出。 例如,考虑一下: f(x,y) = x*x + y; //it is a mathematical function 无论你使用f(10,4)多less次,它的值总是104 。 因此,无论你在哪里写f(10,4) ,都可以用104replace它,而不用改变整个expression式的值。 这个属性被称为expression式的引用透明 。 正如维基百科所说( 链接 ), 相反,在函数代码中,函数的输出值仅仅依赖于input到函数的参数,所以用参数x的相同值调用函数f两次将产生相同的结果f(x)。 所以我的问题是:函数式编程中是否可以存在时间函数(返回当前时间)? 如果是,那么它又如何存在? 这是否违反函数式编程的原则? 它特别违反了参照透明性 ,这是函数式编程的一个属性(如果我正确地理解它的话)。 或者如果没有,那么在函数式编程中如何知道当前的时间呢?
我现在找不到,但我发誓曾经是一件以不朽名言为特色的T恤衫: 什么部分 你不明白吗? 就我而言,答案就是……所有这一切! 特别是,我经常在Haskell的论文中看到这样的符号,但是我不知道它的意思。 我不知道它应该是什么math分支。 我当然认识到希腊字母的字母,象“∉”这样的符号(通常意味着某些东西不是集合中的一个元素)。 另一方面,我从来没有见过“⊢”( 维基百科声称它可能意味着“分区” )。 我也不熟悉在这里使用的vinculum。 (通常它表示一个分数,但在这里似乎不是这种情况。) 我想,SO不是解释整个Milner Hindleyalgorithm的好地方。 但是如果至less有人能告诉我从哪里开始去理解这个符号之海意味着什么,这将是有帮助的。 (我相信我不能是唯一想知道的人…)
当我有类似的function f :: (Ord a) => a -> a -> Bool fab = a > b 我想用不包含这个函数的函数。 比如像这样做function g :: (Ord a) => a -> a -> Bool gab = not $ fab 我可以使combinator像 nf = (\a -> \b -> not $ fab) 但我不知道如何。 *Main> let nf = (\a -> \b -> not $ fab) […]
我有一个对象: myObject = { 'a': 1, 'b': 2, 'c': 3 } 我正在寻找一个本地方法,类似于Array.prototype.map ,将使用如下: newObject = myObject.map(function (value, label) { return value * value; }); // newObject is now { 'a': 1, 'b': 4, 'c': 9 } JavaScript是否具有对象的mapfunction? (我想要这个Node.JS,所以我不关心跨浏览器的问题。)
我一直认为函数式编程可以用Python来完成。 因此,我很惊讶Python在这个问题上没有太多提及,当提到时,它通常不是很积极。 然而,没有多less原因给出(缺less模式匹配和代数数据types被提及)。 所以我的问题是:为什么不是Python对函数式编程非常好? 是否有比缺乏模式匹配和代数数据types更多的原因? 或者这些概念对函数式编程如此重要,以至于不支持它们的语言只能被归类为二次函数式编程语言。 (请记住,我在函数式编程方面的经验非常有限。)
我花了一些时间开始研究关于stream和lambdas的java-8嗡嗡声。 让我吃惊的是,你不能直接在java.util.Collection上应用Stream操作,比如.map() .filter() 。 是否有一个技术原因,为什么java.util.Collection接口没有扩展这些stream操作的默认实现? 使用Googlesearch一下,我看到很多例子都是按照以下模式进行编码的: List<String> list = someListExpression; List<String> anotherList = list.stream().map(x -> f(x)).collect(Collectors.toList()); 如果你在你的代码中有很多这样的stream操作,就会变得非常笨拙。 由于.stream()和.collect()与你想expression的内容完全无关,所以你更愿意说: List<String> list = someListExpression; List<String> anotherList = list.map(x -> f(x));
我已经阅读了关于stackflow和其他来源的封闭的话题,还有一件事仍然令我困惑。 从技术上来说,我已经能够将闭包简单地归结为包含函数代码和该函数中绑定variables值的数据集合。 换句话说,从我的理解来说,从技术上讲,下面的C函数应该是一个闭包: int count() { static int x = 0; return x++; } 然而,我所读的一切似乎意味着闭包必须以某种方式将函数作为第一类对象传递。 另外,通常似乎暗示封锁不是程序性编程的一部分。 这是一个解决scheme与解决的问题过度相关的情况,还是我误解了确切的定义?
使用代数数据types在haskell中表示树或列表是很容易的。 但是,你将如何去印刷代表图表? 看来你需要有指针。 我猜你可能有类似的东西 type Nodetag = String type Neighbours = [Nodetag] data Node a = Node a Nodetag Neighbours 这是可行的。 不过感觉有点分离; 结构中的不同节点之间的链接并不真正像列表中当前的前一个和下一个元素之间的链接或者树中的节点的父节点和子节点那样“感觉”固定。 我有一个预感,在图上进行代数操作,因为我定义它会受到通过标签系统引入的间接级别的阻碍。 主要是这种怀疑和不雅的感觉,使我提出这个问题。 Haskell有更好的/更好的math方法来定义图表吗? 还是我偶然发现了一些本质上很难/根本的东西? recursion数据结构是甜的,但这似乎是别的东西。 一个自我指涉的数据结构与树和列表是如何自我指涉的意义不同。 就像列表和树木在types层面上是自引用的,但graphics在值层面上是自引用的。 那么究竟发生了什么?
我正在尝试在function性编程的新jdk8版本中做一个相对基本的东西,但是不能得到它的工作。 我有这个工作代码: import java.util.*; import java.util.concurrent.*; import java.util.stream.*; public class so1 { public static void main() { List<Number> l = new ArrayList<>(Arrays.asList(1, 2, 3)); List<Callable<Object>> checks = l.stream(). map(n -> (Callable<Object>) () -> { System.out.println(n); return null; }). collect(Collectors.toList()); } } 它需要一个数字列表,并产生一个可以打印出来的函数列表。 然而,对Callable的显式转换似乎是多余的。 这似乎对我和IntelliJ。 我们都同意,这也应该工作: List<Callable<Object>> checks = l.stream(). map(n -> () -> { System.out.println(n); […]