我的项目有一个mysql数据库和一个由Clojure编写的后端.
一些数据库表每天只更新一次,以查询我们将使用的最新信息.
但:
数据库非常大,网络速度很慢,因此每个查询都需要几秒钟.
我们需要在每次查询后进行复杂的计算.
我们需要进行多种sql查询,因此保存每个sql查询的结果是不现实的.
我们需要经常更改计算函数以进行调试.
对于我们来说,在慢速sql查询的情况下,所有事情都太慢了.
幸运的是,我们的数据每天只会更新一次,并且我们经常使用来自数据库的一些查询.
所以我们要缓存常用的sql查询和中间结果.
Clojure的memoize功能对这类工作有用吗?我担心sql查询不纯,所以memoize不应该缓存他们的结果.但是有一天我们的SQL查询结果必须相同.
那么我可以memoize在一天内得到结果并在第二天自动更新结果吗?
谢谢您的帮助!
我有一个本机的android应用程序。我在index.android.js中的组件是无状态的,因此eslint抛出错误“组件应作为纯函数编写”。如果我将组件设为纯函数,该如何注册应用程序或实例化应该如何?
上下文:
Run Code Online (Sandbox Code Playgroud)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]这种记忆化的实现技术在许多编程语言中被广泛使用,但它不能直接应用于 Haskell,因为 Haskell 是纯的,我们不想为了记忆一个函数而引入杂质。幸运的是,由于 Haskell 的惰性求值特性,可以在没有副作用的情况下记住一个函数。
以下
memoize函数采用类型函数Int -> a并返回同一函数的记忆版本。诀窍是将函数转换为值,因为在 Haskell 中,函数不会被记忆,但值会被记忆。
问题:
haskell functional-programming memoization lazy-evaluation pure-function
在 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)
由于method1和method2是纯函数,因此评估彼此独立,编译器可以并行化这两个调用。
像 Haskell 这样的语言内部有结构(比如 IO monad),它告诉函数是纯函数还是执行一些 IO 操作。但是 Scala 编译器如何检测一个函数是纯函数呢?
在一个我不太了解的 Haskell 程序中,我想要一个函数
myInfo :: Int -> Picture
myInfo mode =
...
Run Code Online (Sandbox Code Playgroud)
总是比正常情况多花 2 秒(以减慢输出速度)。
我查了一下Control.Concurrent.threadDelay,但由于它的签名,我无法弄清楚如何将它放在定义threadDelay :: Int -> IO ()函数的程序的纯部分中。myInfo
是否可以myInfo在不将函数带入 Haskell 程序的不纯区域的情况下减慢速度(例如 2 秒)?
该解决方案不需要具有生产性能。(这只是为了更好地理解程序的自动运行而采取的临时措施。)
haskell ×2
caching ×1
clojure ×1
eslint ×1
memoization ×1
pause ×1
react-native ×1
scala ×1
wait ×1