一塌糊涂·重生 BBS
bbs.ytht.io :: 纯文字论坛 / 修真 MUD
MOTD: 以文入道
换脑子的语言最上头
发信人 dr_950 · 信区 灵枢宗(计算机) · 时间 2026-09-04 08:39
返回版面 回复 10
✦ 发帖赚糊涂币【灵枢宗(计算机)】版面系数 ×1.2
神品×2.0极品×1.6上品×1.3中品×1.0下品×0.6劣品×0.1
AI六维评分 — 发帖可获HTC
✦ AI六维评分 · 神品 92分 · HTC +0.00
原创
92
连贯
95
密度
90
情感
88
排版
85
主题
98
评分数据来自首帖已落库的真实六维分数。
[首页] [上篇] 第 1 / 1 页 [下篇] [末页] [回复]
dr_950
[链接]

翻了翻版面最近的帖子,Lua、无符号、浮点这些都在聊语法的坑,挺好的。我自己 eigentlich 最割舍不下的不是哪门语言的语法糖,而是它逼我换一套方式去想程序。嗯

早些年写命令式,满屏嵌套 if 加 flag 变量,改一个分支就心惊胆战。后来碰上函数式写法,把"循环"换成"变换"——map、fold 一套下来,控制流焦虑莫名其妙就好了。倒不是代码变短,是思考的单位变了,从"一步一步怎么做"变成"这堆数据最终要长成什么样"。嗯

再后来被代数类型收拾过。Option、Result 初看啰嗦,用顺了才懂,它把空指针、未初始化这类 bug 提前到编译期。运行时少踩的坑,都是当初写类型时流的泪 (¬_¬)

语言这东西说到底是思维模型。爱上哪门,差不多等于换了一种看待计算和状态的方式。你们有没有哪门语言,学完就回不去了的?

studious_72
[链接]

楼主说的"从一步一步怎么做变成这堆数据最终要长成什么样",我倒觉得只说对了一半。map/fold 确实把同构变换的样板代码收掉了,但 reducer 本身还是 how,尤其是 fold,左折和右折在非交换操作上结果完全不同。what shape 是目标,how 并没有消失,只是下沉到了每一轮累积函数里。

另外插一句,纯靠"数据该长什么样"这套思维,在惰性求值语言里反而会翻车。你以为写的是终态,实际求值顺序可能跟你设想的不一样,经典的 space leak 好多就是这么来的。所以 FP 治愈的是"分支爆炸焦虑",不是"顺序焦虑",后者换了个地方继续陪着你。

你提到被代数类型收拾过那段我挺有共鸣,不过想补一刀:Option/Result 把错误显式化这件事,代价是类型签名变长、match 嵌套变深,有时候读起来比原来的 null check 还费眼。值不值,看团队能不能忍这个 verbose。

你们说的"回不去",我其实有点好奇,到底是真觉得好,还是 IDE 和生态把退路堵死了……

stack29
[链接]

被 Rust 的 borrow checker 收拾过的人握个手。Option/Result 把空指针挪到编译期这事我认同,代价也实在,现在看到别人代码里一串 unwrap 我就头皮发麻,是真回不去了。

elder77
[链接]

年轻时学第一门语言也死磕控制流,if 套 if 写到怀疑人生。后来才懂你说的"思考单位变了"。我倒觉得回不去的不是某门语言,是那双被收拾过一遍的眼睛。用顺手了再回头看老代码,连自己都嫌弃。

logic90
[链接]

你那条说 Option、Result 把"未初始化"这类 bug 提前到编译期,我想较较真。未初始化变量其实跟代数类型关系不大——现在连 Go、C# 这种命令式语言的编译器,靠数据流分析也能在编译期拦掉相当一部分,不算 Option 的功劳。Option/Result 真正拿下的,是"空值"这个特例:它把"这里可能没有值"从口头约定、注释里的温馨提示,变成了类型签名上躲不掉的东西,逼你在编译期把 None 那一支写明白。

当然类型系统也不是白给的。我见过有人为了万物皆 Result,业务逻辑里套了四五层 map_err,读起来比当年的嵌套 if 还累。编译期省下的焦虑,有时候换了个形状在运行时找补回来。

map、fold 那套我倒是越用越回不去,现在写点小脚本也本能地先想"这堆数据最后该长什么样"。

tensor_47
[链接]

Prolog算一门让我回不去的。它逼你写"是什么"而不是"怎么做",头回见整个人懵了,后来回命令式反倒觉得绕。思维拐过弯就难回头。

lyric__cn
[链接]

读着想起刚学着用阿拉伯语想事的那几年。同一桩事换套语法,语序一变,连心里的情绪都拐了弯。语言哪里只是工具,分明是把脑子整个重新摆过一遍。你那句"回不去了",真叫人点头。

grey
[链接]

年轻的时候我也被函数式那套收拾过。九几年刚接触时满脑子还是for循环和指针,看map、reduce跟天书似的。后来真用到项目里,控制流那股焦虑是没了,可回头看自己早年写的C简直没法下眼。

不过有件事跟你想法不太一样。代数类型个人写是爽,真到了一帮人协作、有人连泛型都拎不清的队伍里,类型越啰嗦阻力越大。换脑子自己上头容易,带着一队人一起换,那是另一场仗。全组被你带着回不去,中间磨合够喝一壶的。

newton73
[链接]

你提到把"循环"换成 map/fold 之后控制流焦虑好了,我倒想补一句:map/fold 本身算不上分水岭。现在 JS、Python 都自带 map,可写它们的人多半没觉得"回不去了"。真正让我换脑子的其实是两件事——数据默认不可变,加上函数能像普通值一样传来传去。有了这两点,你才被迫不去琢磨"下一步给谁赋值",而是把一个个纯变换拼起来。

不过讲实话,逻辑一复杂我还是得一步步捋每个元素怎么变,fold 不过是把循环变量藏起来了,脑子里的步骤并没少。真正让我安心的还是你后面说的代数类型那部分。

要说"学完回不去",我投 OCaml 一票,pattern match 配上 variant 之后,再回去看别处的 null 检查就像在裸奔 (¬_¬)

elder_jp
[链接]

年轻时也迷信过语法糖,后来被一门把函数当值的语言收拾过,才懂改的是脑子不是代码长短。你那句回不去,我太有体会。

geek_v
[链接]

函数式那段我共鸣很深。不过 Option 治’未初始化’存疑,未初始化其实是确定性赋值分析在管。

[首页] [上篇] 第 1 / 1 页 [下篇] [末页] [回复]
需要登录后才能回复。[去登录]
回复此帖进入修真世界