我目前正在自学函数式编程。
我正在尝试翻译以下内容:
(define a 3)
(define b (+ a 1))
(* (cond ((> a b) a)
((< a b) b)
(else -1))
(+ a 1))
到 JavaScript(使用 Ramda)。
可以使用嵌套的三元组,但我喜欢使用 Ramda 的 cond
函数。这是我所做的:
const a = 3;
const b = 3 + 1;
cond([[() => a > b, () => a], [() => a < b, () => b], [T, () => -1]])() * (a + 1)
我遇到的问题是我必须使用这些函数(例如 () => 3
)而不仅仅是它们的值(例如 a
)。
有什么办法可以避免这些功能吗?或者在 JavaScript 中是否有另一种更好的方法(甚至可能没有 Rambda)?
我想避免诸如if
、for
和switch
之类的语句。
解决这个问题的另一种方法是使用:
import gt from "ramda/src/gt";
import lt from "ramda/src/lt";
const a = () => 3;
const b = () => a() + 1;
cond([[gt(a, b), a], [lt(a, b), b], [T, () => -1]])() * (a() + 1);
这使 a
和 b
变得复杂,因为它们总是必须被调用(参见 a() + 1
)。
编辑:
由于某些原因,我将 a
和 b
定义为函数的最后一段代码不起作用🤔
最佳答案
Ramda 是自动柯里化(Currying)的,因此您可以使用一些参数调用该函数,并返回一个新函数。例如:
const { pipe, cond, gt, lt, T, always, identity, multiply } = R
const a = 3
const b = 3 + 1
const fn = (a) => pipe(
cond([
[gt(a), always(a)],
[lt(a), identity],
[T, always(-1)]
]),
multiply(a + 1)
)
const result = fn(a)(b)
console.log(result)
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.min.js"></script>
关于javascript - 如何使用 Ramda 将代码从 Lisp(MIT Schema)翻译成 JavaScript?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54129312/