【问题标题】:JavaScript (es6) haskel where alternativeJavaScript (es6) haskel where 替代
【发布时间】:2020-04-09 20:15:11
【问题描述】:

在 Haskell 中,您可以像这样为临时变量创建 where 条件:

f x
  | cond1 x   = a
  | cond2 x   = g a
  | otherwise = f (h x a)
  where
    a = w x

是否可以在 javascript 中创建它,但使用表达式而不是语句。

例如:

let a = 10;
let b = a + 20;

return a + b

这只是一个简单的示例,不需要临时变量,但它只是示例。

下面的例子是带有语句的 - 但我想知道表达式是否有很好的替代方案。

如果合适,可以使用 Ramdajs。

谢谢

【问题讨论】:

  • where 始终是函数的局部变量,确保您可以轻松地将声明放入函数中
  • "下面的例子是带语句的" - 你指的是什么例子?
  • using语句有什么问题?
  • 请注意,这也是 Haskell 中的语句,而不是表达式 (let a = w x in …)
  • 你不能直接在另一个函数中传递它

标签: javascript functional-programming


【解决方案1】:

IIFE 会起作用:

  (a => (b => a + b)(a + 20))(10)

【讨论】:

  • 或者更清楚地说,((a = 10, b = a + 20) => a + b)()
  • 谢谢,它可以工作,但如果我有 3、4 个变量,我发现很难阅读,反正我没有找到更好的东西
  • @JonasWilms 当然,但整个事情都是一个表达式。无论如何,我不明白一切都是一种表达的魅力。事实上,正如 Bergi 指出的,Haskell 中的where 子句也不是一个表达式。
  • @AaditMShah 我更喜欢带有 const 声明的 IIFE,谢谢 :-)
【解决方案2】:

最接近的是 lambda / 箭头函数,当场调用。

来自Haskell: Where vs. Let的例子(因为我不懂Haskell)

f x y  |  y>z           =  ...
       |  y==z          =  ...
       |  y<z           =  ...
     where z = x*x

可能是这样的

((x,y)=>{
  let z=x*x;
  if(y>z){console.log("y>z");}
  else if(y==z){console.log("y==z");}
  else /*if(y<z)*/{console.log("y<z");}
})(10,20);

好吧,如果我正确理解 f x y | ... 是某种带有谓词的 switch 语句(它不会真正转换为 JS 的 switch

【讨论】:

  • 谢谢,我会用语句来写,那样字符多,难读
【解决方案3】:

您可以创造性地使用Javascript的默认参数:

const _let = f => f();

const main = _let((a = 10, b = a + 20) =>
  a + b);

console.log(main);

请注意,默认参数不是递归计算的,即左侧参数不能依赖于右侧参数。

【讨论】:

    猜你喜欢
    • 2016-04-02
    • 2023-03-11
    • 2017-10-11
    • 2015-12-30
    • 1970-01-01
    • 2017-05-13
    • 2022-07-24
    相关资源
    最近更新 更多