标签: let

剥离Haskell

我应该首先提一下,我对Haskell很新.有没有特别的理由let在Haskell中保留表达式?

我知道Haskell摆脱了rec对应于let语句的Y-combinator部分的关键字,表明它是递归的.为什么他们没有let完全摆脱声明呢?

如果他们这样做,陈述在某种程度上似乎会更加迭代.例如,类似于:

let y = 1+2
    z = 4+6
    in y+z
Run Code Online (Sandbox Code Playgroud)

只会是:

y = 1+2
z = 4+6
y+z
Run Code Online (Sandbox Code Playgroud)

对于熟悉函数式编程的人来说,哪个更易读,更容易阅读.我能想到保持它的唯一原因是这样的:

aaa = let y = 1+2
          z = 4+6
          in  y+z
Run Code Online (Sandbox Code Playgroud)

如果没有这个let,我认为最终会出现模棱两可的语法:

aaa = 
  y = 1+2
  z = 4+6
  y+z
Run Code Online (Sandbox Code Playgroud)

但是如果Haskell没有忽略空格,并且代码块/范围与Python类似,它是否能够删除let

是否有更强的理由留下来let

对不起,如果这个问题看起来很愚蠢,我只是想了解更多关于它为什么存在的问题.

haskell let

10
推荐指数
4
解决办法
644
查看次数

循环宏中的Common Lisp绑定

我想在循环中重新绑定一个特殊变量.现在,通常,这是使用a完成的let.

(let ((*read-eval* nil))
  (do-something-here))
Run Code Online (Sandbox Code Playgroud)

但由于loop宏有这些好的with条款,我想我可能会在那里这样做.表达式(macroexpand '(loop with *read-eval* = nil))最终将绑定扩展为a let,因此它肯定会对我的实现有所帮助.但我在标准中找不到任何表明这是标准化行为的内容.所以,我想,我的问题是:

(loop with *read-eval* = nil
      for i from 1 to 10
      do (something-involving-the-read-function))
Run Code Online (Sandbox Code Playgroud)

是否需要符合实现来修改现有*read-eval*变量,或者是否存在可能创建同名新词法变量的风险?

loops common-lisp let dynamic-scope

10
推荐指数
1
解决办法
479
查看次数

'let'是否覆盖全局声明并抛出ReferenceError?

我正在阅读文档示例之间的区别,varlet测试当调用未声明的变量时,全局作用域自动为其提供声明(这就是为什么以下代码段不会在任何变量中引发错误):

x = 3;
console.log(x);

(function() {
  y=x+39;
})()
console.log(y);
Run Code Online (Sandbox Code Playgroud)

但是,当let在同一全局范围内赋值后声明一个变量时:

x=3;
let x = 42;
console.log(x);
Run Code Online (Sandbox Code Playgroud)

抛出以下错误之一:

ReferenceError:x未定义(Chromium)

ReferenceError:x在初始化之前无法访问词法声明(Firefox)

我明白这let不允许x提升,但由于它先前被引用(暗示来自全局范围的自动声明),在这种情况下不应该重新声明吗?

SyntaxError:x已声明标识符

因此抛出上面的错误?

我也明白,在严格模式下,第一个片段会抛出一个ReferenceError,所以这是否意味着let在全局范围内强制执行严格模式的特定规则(所有变量都需要声明)?

javascript scope global let ecmascript-6

10
推荐指数
1
解决办法
1680
查看次数

这怎么让表达起作用?

鉴于这一系列的Haskell代码,我的任务是将其评估为最简单的形式.

let g h k = (\x -> k (h x)) in g (+1) (\x -> x+x) 20
Run Code Online (Sandbox Code Playgroud)

我已经得到了答案(当然在GHCI中我自己进行了评估): 42

但是,我希望更好地了解评估在这里如何运作.一般来说,我想我知道如何(简单)让表达式工作:

a = let y = 5 in y * 5  -- a == 25
Run Code Online (Sandbox Code Playgroud)

该计算结果为25,因为我们绑定y到的价值5a被分配到的值y*5(后部分in).绑定y = 5仅在范围内有效let.

到目前为止,唯一的解释(至少评估为42)如下:

let g h k = (\x -> k (h x)) in g (+1) (\x -> x+x) 20
Run Code Online (Sandbox Code Playgroud)
  • g(\x -> k (h x)) …

lambda haskell anonymous-function let expression-evaluation

10
推荐指数
2
解决办法
318
查看次数

如何检查ES6上是否声明了`let`变量?

与传统的var声明变量不同,它们附加到整个封闭的函数作用域,无论它们出现在何处 - let声明都附加到块作用域,但在它们出现在块中之前不会初始化

所以:

console.log( a ); // undefined
console.log( b ); // ReferenceError!

var a;
let b;
Run Code Online (Sandbox Code Playgroud)

所以似乎这里没有应用吊装.

如果是这样,我如何安全地检查变量是否已被声明?

NB - 我看到的选项是try/catch,当然总是将let变量放在第一位.但我的问题仍然存在

javascript let ecmascript-6

9
推荐指数
2
解决办法
2155
查看次数

'let和'var'在Typescript中是一样的吗?

我正在看一下AngularJS 2和Typescript,我决定用这个来学习一些打字稿的基础知识.通过许多研究,我找到了关于模块,Typescript的好主题,其中一个讨论了'let'和'var'命令来声明变量; 根据这个问题,下面的Typescript代码应该只显示一个警报并在控制台中抛出错误:

test.ts:

for(let i = 0; i < 1; i++) {
    alert(i);
}
alert(i);
Run Code Online (Sandbox Code Playgroud)

编译test.js:

for(var i = 0; i < 1; i++) {
    alert(i);
}
alert(i);
//# sourceMappingURL=test.js.map
Run Code Online (Sandbox Code Playgroud)

但事实并非如此.编译器"忽略""let"命令并将其转换为"var"命令.为什么会这样?Typescript只适用于类吗?

我正在使用AngularJS配置'npm start',因此它会自动编译我的'test.ts'文件:

  "scripts": {
    "start": "tsc && concurrently \"npm run tsc:w\" \"npm run lite\" ",
    "lite": "lite-server",
    "postinstall": "typings install",
    "tsc": "tsc",
    "tsc:w": "tsc -w",
    "typings": "typings"
  },
Run Code Online (Sandbox Code Playgroud)

javascript var let typescript

9
推荐指数
1
解决办法
8455
查看次数

Swift - Lazy Var vs.以编程方式创建视图(保存内存)

我是初学者,我有点理解Lazy Var vs. Let.我注意到,当使用Lazy Var时,特别是使用ImageViews,可以节省大量的内存使用量.但是到目前为止我看过的教程和指南并没有经常使用Lazy Var,所以我很怀疑它是不好的做法而且我忽略了一些东西.

我做了一点研究,得知Lazy不是"线程安全",但我不明白这意味着什么.我已经看到了很多优点和缺点,但我无法得出任何结论,特别是因为我的知识非常有限.

什么时候(或更好)在创建UIView时使用Lazy Var vs. Let?

lazy var profileImageView: UIImageView = {

    let imageView = UIImageView(image: #imageLiteral(resourceName: "page1"))
    imageView.translatesAutoresizingMaskIntoConstraints = false
    imageView.contentMode = .scaleAspectFit
    return imageView

}()
Run Code Online (Sandbox Code Playgroud)

var let swift

9
推荐指数
3
解决办法
2772
查看次数

如何在声明ES6值后将其确定为var / const / let?

我知道我可以找出一个值是var const还是let通过查看它的声明位置。但是,我想知道-主要是用于调试,开发JS编译器以及学术兴趣-是否有可能在创建变量后找出变量的不变性/范围(var / const / let-ness)。

doThing(something)
Run Code Online (Sandbox Code Playgroud)

会回来

let
Run Code Online (Sandbox Code Playgroud)

或同等学历。就像我们可以使用构造函数typeofsomething.constructor.name为构造函数确定类型。

javascript const let

9
推荐指数
1
解决办法
171
查看次数

Haskell 中的“let”和“in”是什么意思?

我觉得这个看似简单而本质的东西对我来说完全是神秘的。“让”表达是什么意思?我试过谷歌,但结果充满了我不明白的概念。

这是我在讲座中编写的一些代码。它标识给定的字符串是否是回文。我也不太明白 return 关键字在哪里。是“在”吗?这个功能的范围是什么?我很茫然。

module Main where

isPalindrome :: Text -> Bool
isPalindrome text1 
  = let
    list = toString text1
    backwards = reverse list
    in list == backwards
Run Code Online (Sandbox Code Playgroud)

当它出现在“让”之后时,“in”是什么意思?

我是学 C# 的,对函数式编程一窍不通。

谢谢你。

haskell functional-programming let

9
推荐指数
2
解决办法
222
查看次数

无法理解 JS 中这个 for 循环的输出

我已经明白为什么这段代码的输出应该是3 3 3.

for (var i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 1);
}
Run Code Online (Sandbox Code Playgroud)

但我无法理解为什么这段代码的输出是0 1 2.

for (let i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 1);
}
Run Code Online (Sandbox Code Playgroud)

我希望第二个循环的输出更加清晰for

javascript for-loop var let settimeout

9
推荐指数
3
解决办法
1万
查看次数