关于GHCi中let关键字变量赋值的困惑
GHCi中
let的必要性与关键区别 历史兼容性:早期GHCi版本必须用
let定义变量,因为交互提示符本质是在表达式上下文里,而Haskell语法要求在表达式环境中引入变量绑定必须用let。《Learn You a Haskell》成书时GHCi还没支持无let的语法糖,所以统一用let写法,这种写法在所有版本的GHCi里都能正常运行,不会出现兼容性问题。新版本的语法糖:现在的GHCi默认支持省略
let的简单绑定,比如直接输入area = pi * 5 ^ 2,这其实是GHCi自动帮你补上了let,和手动写let area = ...效果完全一致,但这只适用于单条、无模式匹配、无类型签名的简单定义。复杂场景必须用
let:遇到以下情况,省略let会直接报错:- 一次性定义多个变量:
Prelude> let x = 10; y = 20 - 带模式匹配的绑定:
Prelude> let (a, b) = (3, 4) - 带类型签名的函数定义:
Prelude> let double :: Int -> Int; double n = n * 2 - 在表达式内部临时绑定变量(而非定义顶层变量):
Prelude> let r = 5 in pi * r ^ 2
- 一次性定义多个变量:
简单说,单条简单绑定可以省let,但涉及复杂绑定、局部表达式内的变量,或者需要兼容旧版本时,let是必不可少的。
内容的提问来源于stack exchange,提问作者blex-max
相关产品推荐
相关产品推荐

