javascript - 如何使用 Ramda 将代码从 Lisp(MIT Schema)翻译成 JavaScript?

标签 javascript functional-programming lisp ramda.js mit-scheme

我目前正在自学函数式编程。

我正在尝试翻译以下内容:

(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)?

我想避免诸如ifforswitch 之类的语句。

解决这个问题的另一种方法是使用:

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);

这使 ab 变得复杂,因为它们总是必须被调用(参见 a() + 1)。

编辑:

由于某些原因,我将 ab 定义为函数的最后一段代码不起作用🤔

最佳答案

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/

相关文章:

javascript - 如何在 div 的背景中加载谷歌地图?

javascript - 检测形式变化

scala - 不变性设计(在 Scala 中)

lisp - 如何定义惰性 AND

javascript - 展平 promise 链并执行特定于错误的 catch 语句

java-8 - vavr中的流生成器​​方法

java - 为什么被视为一等公民的职能如此重要?

lambda - Lisp 奇怪的段错误可能是 eval 错误

compiler-construction - 方案中的匿名宏

javascript - 使用 Select2 插件标记 Twitter 和 Facebook