标签: pure-function

Clojure的`memoize`函数是否可用于缓存慢速sql查询和复杂计算?

我的项目有一个mysql数据库和一个由Clojure编写的后端.

一些数据库表每天只更新一次,以查询我们将使用的最新信息.

但:

  1. 数据库非常大,网络速度很慢,因此每个查询都需要几秒钟.

  2. 我们需要在每次查询后进行复杂的计算.

  3. 我们需要进行多种sql查询,因此保存每个sql查询的结果是不现实的.

  4. 我们需要经常更改计算函数以进行调试.

对于我们来说,在慢速sql查询的情况下,所有事情都太慢了.

幸运的是,我们的数据每天只会更新一次,并且我们经常使用来自数据库的一些查询.

所以我们要缓存常用的sql查询和中间结果.

Clojure的memoize功能对这类工作有用吗?我担心sql查询不纯,所以memoize不应该缓存他们的结果.但是有一天我们的SQL查询结果必须相同.

那么我可以memoize在一天内得到结果并在第二天自动更新结果吗?

谢谢您的帮助!

caching clojure pure-function

1
推荐指数
1
解决办法
166
查看次数

组件应写为纯函数

我有一个本机的android应用程序。我在index.android.js中的组件是无状态的,因此eslint抛出错误“组件应作为纯函数编写”。如果我将组件设为纯函数,该如何注册应用程序或实例化应该如何?

pure-function eslint react-native react-native-android

1
推荐指数
1
解决办法
2233
查看次数

Haskell 中的记忆

上下文

def fib(n):
    if n < 2: return 1
    return fib(n-1) + fib(n-2)
Run Code Online (Sandbox Code Playgroud)

可以通过记忆加速:

fib_memo = {}
def fib(n):
    if n < 2: return 1
    if not fib_memo.has_key(n):
        fib_memo[n] = fib(n-1) + fib(n-2)
    return fib_memo[n]
Run Code Online (Sandbox Code Playgroud)

这种记忆化的实现技术在许多编程语言中被广泛使用,但它不能直接应用于 Haskell,因为 Haskell 是纯的,我们不想为了记忆一个函数而引入杂质。幸运的是,由于 Haskell 的惰性求值特性,可以在没有副作用的情况下记住一个函数。

以下memoize函数采用类型函数Int -> a 并返回同一函数的记忆版本。诀窍是将函数转换为值,因为在 Haskell 中,函数不会被记忆,但会被记忆。

问题:

  1. 函数式编程中的函数和值不是一样的吗?
  2. 缓存如何不被视为副作用(在纯函数的上下文中)

haskell functional-programming memoization lazy-evaluation pure-function

1
推荐指数
1
解决办法
179
查看次数

Scala 编译器:检测纯/不纯函数

在 Scala、Haskell 等 FP 语言中,使用了纯函数,这使得编译器可以优化代码。例如:

val x = method1()// a pure function call
val y = method2// another pure function call
val c = method3(x,y)
Run Code Online (Sandbox Code Playgroud)

由于method1method2是纯函数,因此评估彼此独立,编译器可以并行化这两个调用。

像 Haskell 这样的语言内部有结构(比如 IO monad),它告诉函数是纯函数还是执行一些 IO 操作。但是 Scala 编译器如何检测一个函数是纯函数呢?

scala pure-function

1
推荐指数
1
解决办法
75
查看次数

我可以让一个纯 Haskell 函数等待 2 秒吗?

在一个我不太了解的 Haskell 程序中,我想要一个函数

myInfo :: Int -> Picture
myInfo mode =
   ...
Run Code Online (Sandbox Code Playgroud)

总是比正常情况多花 2 秒(以减慢输出速度)。

我查了一下Control.Concurrent.threadDelay,但由于它的签名,我无法弄清楚如何将它放在定义threadDelay :: Int -> IO ()函数的程序的纯部分中。myInfo

是否可以myInfo在不将函数带入 Haskell 程序的不纯区域的情况下减慢速度(例如 2 秒)?

该解决方案不需要具有生产性能。(这只是为了更好地理解程序的自动运行而采取的临时措施。)

haskell wait pure-function pause

0
推荐指数
1
解决办法
163
查看次数