我应该首先提一下,我对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?
对不起,如果这个问题看起来很愚蠢,我只是想了解更多关于它为什么存在的问题.
我想在循环中重新绑定一个特殊变量.现在,通常,这是使用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*变量,或者是否存在可能创建同名新词法变量的风险?
我正在阅读文档示例之间的区别,var并let测试当调用未声明的变量时,全局作用域自动为其提供声明(这就是为什么以下代码段不会在任何变量中引发错误):
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在全局范围内强制执行严格模式的特定规则(所有变量都需要声明)?
鉴于这一系列的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到的价值5和a被分配到的值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)) …与传统的var声明变量不同,它们附加到整个封闭的函数作用域,无论它们出现在何处 - let声明都附加到块作用域,但在它们出现在块中之前不会初始化
所以:
console.log( a ); // undefined
console.log( b ); // ReferenceError!
var a;
let b;
Run Code Online (Sandbox Code Playgroud)
所以似乎这里没有应用吊装.
题
如果是这样,我如何安全地检查变量是否已被声明?
NB - 我看到的选项是try/catch,当然总是将let变量放在第一位.但我的问题仍然存在
我正在看一下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) 我是初学者,我有点理解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 const还是let通过查看它的声明位置。但是,我想知道-主要是用于调试,开发JS编译器以及学术兴趣-是否有可能在创建变量后找出变量的不变性/范围(var / const / let-ness)。
即
doThing(something)
Run Code Online (Sandbox Code Playgroud)
会回来
let
Run Code Online (Sandbox Code Playgroud)
或同等学历。就像我们可以使用构造函数typeof或something.constructor.name为构造函数确定类型。
我觉得这个看似简单而本质的东西对我来说完全是神秘的。“让”表达是什么意思?我试过谷歌,但结果充满了我不明白的概念。
这是我在讲座中编写的一些代码。它标识给定的字符串是否是回文。我也不太明白 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# 的,对函数式编程一窍不通。
谢谢你。
我已经明白为什么这段代码的输出应该是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。
let ×10
javascript ×5
haskell ×3
var ×3
ecmascript-6 ×2
common-lisp ×1
const ×1
for-loop ×1
global ×1
lambda ×1
loops ×1
scope ×1
settimeout ×1
swift ×1
typescript ×1