问题标签 [imperative-programming]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell - 运行时是否通常使用类似命令式的函数式语言代码解释
我有一个关于函数式语言解释器的一般性问题:
在运行时使用函数式语言与命令式语言(或进入解释器)实际上有什么优势吗?
我看到的所有问题(例如this)都没有真正解决这个问题,并且搜索中充斥着关于不同语言定义的争论。
编辑:精简到我最终需要回答的唯一问题。
algorithm - 运营商之谜
在将项目从 Python 转换为 C# 时,我发现语法系列中有一些有趣的差异。然而我被卡住了,仍然无法理解和理解C#中比较运算符的不同行为。
在消除这种好奇心的过程中,我考虑了一些 C 语法家族的语言;C、C++、C#、Java、Javascript.. 并验证了行为。它是这样发生的:
现在,考虑以下表达式:
如果是由于right-associativity,那么 JavaScript 中的以下代码不应该像这样:
这是 C/C++ 版本
除了在 Python 中,其中
谁能解释为什么 C 系列语言和 Python 计算表达式的方式不同?
user-interface - 哪些 GUI 库不是面向对象的?
我最近一直在使用 C,并且想要探索编程不仅仅是控制台应用程序。然而,大多数 GUI 库都是面向对象的,很难用 C 等非面向对象的编程语言进行编程。即使是为 C 设计的面向对象的 GUI 库(如 GTK+)也需要大量的样板。因为我在使用这些面向对象的库时遇到了困难,所以我想知道哪些 GUI 库不是面向对象的?
haskell - 声明性语言
我正在阅读一篇关于声明式编程语言的文章。
如果我不了解这种类型/范式的编程语言的质量并且它与命令式语言形成对比,我是否应该只阅读这种类型的编程语言(如 Haskell)的编程,然后再阅读那篇文章?
c# - 在循环迭代之间执行代码
假设你想循环 3 个这样的元素:
当然,这与说:doSomething(); doSomething(); doSomething();
.
现在,假设您想在每次迭代之间做一些事情,就好像您正在编写这样的代码:
doSomething(); doBetween(); doSomething(); doBetween(); doSomething();
注意如何doSomething()
被调用 3 次,但doBetween()
被调用了 2 次。
现在,我知道如何在循环中执行此操作的唯一方法是:
对我来说,在循环中运行该条件似乎效率低下。它还使您必须查看两次才能理解编程意图。另外,如果您将“3”更改为“for”标题中的其他内容,您可能很容易忘记更改条件,尤其是随着逻辑的增长。不仅如此,这个技巧在 foreach 循环中也不起作用,因为没有简单的方法来检测我们是否正在运行最后一次迭代。
您有什么技巧可以让您以更好的性能、更好的可读性、更好的可维护性或在 foreach 循环中执行此类操作?
performance - 命令式编程和函数式编程的效率
我有一个关于IP和FP性能的问题。假设我有一个计算第 n 个斐波那契数的函数。
在命令式编程中,我可以选择使用迭代方式、递归或动态编程来计算第 n 个斐波那契数。当然,与渐近递归相比,迭代方式和动态规划会表现得更好。
在函数式编程中,假设不涉及状态,那么我只能以递归方式进行。
在这种情况下,这是否意味着与命令式编程相比,函数式编程在效率(渐近)方面的性能总是相同或更慢?
现实世界的函数式编程如何处理这个问题?
python - 将“增长”表的命令式算法转换为纯函数
我的程序是用 Python 3 编写的,它有很多地方都以(非常大的)类似表的数字数据结构开始,并按照某种算法向其中添加列。(算法在每个地方都不一样。)
我正在尝试将其转换为纯函数式方法,因为我遇到了命令式方法的问题(难以重用、难以记忆中间步骤、难以实现“惰性”计算、由于依赖状态而容易出错等) .
该类Table
被实现为字典字典:外部字典包含行,索引为row_id
; 内部包含一行中的值,由 . 索引column_title
。该表的方法非常简单:
到目前为止,我只是在原始表中添加了列,每个函数都将整个表作为参数。当我转向纯函数时,我必须使所有参数不可变。因此,初始表变得不可变。任何其他列都将创建为独立列,并仅传递给需要它们的那些函数。一个典型的函数会获取初始表和一些已经创建的列,并返回一个新列。
我遇到的问题是如何实现独立列(Column
)?
我可以给他们每个人做一本字典,但它似乎很贵。事实上,如果我需要对每个逻辑行中的 10 个字段执行操作,我将需要进行 10 次字典查找。最重要的是,每一列都将包含键和值,使其大小增加一倍。
我可以制作Column
一个简单的列表,并在其中存储对从 row_id 到数组索引的映射的引用。好处是这个映射可以在对应于同一个初始表的所有列之间共享,并且一旦查找一次,它就适用于所有列。但这会产生任何其他问题吗?
如果我这样做,我可以更进一步,并将映射实际存储在初始表本身中吗?我可以将Column
对象的引用放回创建它们的初始表吗?它似乎与我想象的一种功能性工作方法大不相同,但我看不出它会导致什么问题,因为一切都是不可变的。
一般来说,函数式方法是否不赞成在返回值中保留对其中一个参数的引用?看起来它不会破坏任何东西(比如优化或惰性评估),因为无论如何这个参数都是已知的。但也许我错过了一些东西。
type-inference - 具有静态、结构类型和全局类型推断的命令式语言
我知道像 Haskell 这样的语言是静态类型的并且具有类型推断。但是是否存在具有全局类型推断的非函数式语言,相当于具有类型推断和结构类型的 C 语言。
functional-programming - 用表查找替换函数
我一直在和 Brian Beckman 一起看这个 MSDN 视频,我想更好地理解他所说的话:
每个命令式程序员都会经历这个阶段,学习可以用表查找替换函数
现在,我是一名从未上过大学的 C# 程序员,所以也许在某个地方,我错过了其他人都学会理解的东西。
布赖恩是什么意思:
函数可以用表查找代替
是否有这样做的实际例子,它是否适用于所有功能?他给出了 sin 函数的例子,我可以理解,但我如何更一般地理解这个?
c++ - 函数式编程中纯函数的缺点
函数式编程中的纯函数是没有副作用的函数。其含义之一是它不能改变输入参数的值。这可以被视为内存利用率的劣势吗?
例如,假设我有一个函数,它只接受一个列表并在其中添加另一个元素。在 C++ 中,它可能很简单
这个函数显然不会使用比传递对象已经占用的更多内存。
但是在 Haskell 中也会出现这样的情况。
现在在这个计算中,因为 xs 没有改变它的值。所以我是否正确地说,有时该函数将消耗 xs 的内存双倍大小,一个用于 xs,另一个用于返回值。或者以某种方式延迟调用确保实际上 xs 仅通过在最后添加一个元素来返回?
我知道 Monad 是一种可以产生副作用的方法。但是 Monad 可以用来简单地修改输入并返回它的值吗?
也可以将 xs ++ [a] 更改为 a:xs 消耗更少的内存吗?