Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/461.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Ramda将Lisp(mitschema)中的代码翻译成JavaScript?_Javascript_Functional Programming_Lisp_Ramda.js_Mit Scheme - Fatal编程技术网

如何使用Ramda将Lisp(mitschema)中的代码翻译成JavaScript?

如何使用Ramda将Lisp(mitschema)中的代码翻译成JavaScript?,javascript,functional-programming,lisp,ramda.js,mit-scheme,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)) 我遇到的问题是,我必须使用这些函数(例如()=>3),而不仅仅是它们的值(例如a) 有没有办法避免这些功能?或者在JavaScript中有没有其他更好的方法(甚至没有Rambda) 我希望避免使用诸如if、for和switc

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

我试图翻译以下内容:

(define a 3)
(define b (+ a 1))

(* (cond ((> a b) a)
         ((< a b) b)
         (else -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,因此您可以使用一些参数调用函数,并返回一个新函数。例如:

const{pipe,cond,gt,lt,T,always,identity,multiply}=R
常数a=3
常数b=3+1
常数fn=(a)=>管道(
康德([
[gt(a),始终(a)],
[lt(a),身份],
[T,始终(-1)]
]),
乘(a+1)
)
常数结果=fn(a)(b)
console.log(结果)

您不必在Scheme中用thunks(即不带参数的函数)包装所有内容的原因是因为
cond
是一个宏,它可以扩展到嵌套的
if
s,在您的情况下:

(if (> a b) a
  (if (< a b) b
    -1))
(如果(>a b)a
(如果(
所以不,如果你想避免三元运算符和用thunk包装所有东西,你没有太多的选择


如果您不介意使用非标准JS,您可以使用带有…

的宏实现
cond
,我认为您的工作有点误解
cond
旨在为您提供一个功能。它实际上不是为表达式创建标量值而设计的。当然,它可以这样做,只需立即调用它生成的函数。但这不是重点。此外,它实际上并不适用于使用空函数进行调用(默认条件下传递
T
的情况除外)。同样,您可以这样做,但这与工具的纹理相反

尽管Ramda的灵感来自LISP风格和ML风格的函数式语言,尽管我个人更喜欢前者,但Ramda更接近ML世界,尤其是Haskell。因此,它要支持的主要活动是通过组合其他函数来构建函数

如果我要解决这个问题,我可能不会使用任何Ramda,选择这样的东西:

const larger = (a, b) => (a > b) ? a : (b > a) ? b : -1
const foo = (a, b) => (a + 1) * larger(a, b)

foo(3, 4) //=> 16
foo(6, 3) //=> 42
foo(3, 3) //=> -4
const foo = (a, b) => (a + 1) * ((a > b) ? a : (b > a) ? b : -1)
或者,如果我不需要重用
更大的
,我可以这样内联它:

const larger = (a, b) => (a > b) ? a : (b > a) ? b : -1
const foo = (a, b) => (a + 1) * larger(a, b)

foo(3, 4) //=> 16
foo(6, 3) //=> 42
foo(3, 3) //=> -4
const foo = (a, b) => (a + 1) * ((a > b) ? a : (b > a) ? b : -1)
当然,我可以用Ramda写这篇文章,并且是以一种无点的方式:

const larger = cond([[gt, unapply(head)], [lt, unapply(last)], [T, always(-1)]])
const foo = converge(multiply, [inc, larger])
或者再次,我可以内联
较大的
,或者用
nthArg(0)
替换
unapply(head)
,用
nthArg(1)
替换
unapply(last)


但这些选项都不如原始选项可读。拉姆达在这里没有添加任何我能看到的内容。请注意,我是拉姆达的忠实粉丝;我创办了这个图书馆,并且是它的主要作者之一。但我认为它不应该用于所有问题。

非常感谢@J.Hester:
cond
接受一组成对的函数,每个函数都有相同的输入。每对中的第一个应返回布尔值,第二个应返回相关值。因此,
始终
是必要的
always(a)
相当于
()=>a
@ScottSauyet谢谢你的解释。@J.Hester-不客气。我已经对代码进行了一些更新,使其更无意义。除了Scott出色的解释之外,将
始终
替换为
控制台.log
,您可以看到您得到了什么。@Oridori谢谢!从我的类(可能是坏的)转换到一个功能性更强的类是很奇怪的。你必须以完全不同的方式思考。也在与无点风格作斗争,这就是为什么非常感谢您的回答感谢您的见解!你推荐哪个图书馆?如果希望尽可能接近lisp,您会推荐哪一种?一般来说,对于JavaScript中的FP,您会推荐哪一种呢?也感谢您创建Lambda!我最近发现了FP,我正在阅读学习它,但它是用Lisp编写的,我的主要语言是JavaScript。关于如何使用JavaScript学习FP,你有什么建议吗(除了大量练习之外)?我的意思是不需要库。我认为我建议的纯JS版本已经可以阅读了。如果您不喜欢嵌套的三元语句,显然可以使用
If
语句来实现。像Ramda这样的库是对vanilla JS的补充。我认为你正在阅读的《SICP》是目前最好的通用编程入门书。我对JS有两个强烈的建议。Marijn Haverbeke对该语言进行了非常温和的介绍,并展示了FP和OOP代码。对FP JS最好的介绍是Booleans博士,这是目前最常见的介绍。谢谢你的推荐!