我先来:递归 -> Y 组合子 -> Monad
1 liudewa 2024-09-03 17:51:46 +08:00 异步 |
![]() | 3 vfs 2024-09-03 17:53:30 +08:00 一个函数返回另外一个函数,一个函数的参数时另外一个函数。 这绝对是取乱之道 |
![]() | 4 superhot 2024-09-03 18:09:07 +08:00 via Android ![]() @vfs 不懂闭包与函数式编程就别乱说话 你 Java 的接口回调本质上也是把函数作为参数传递 没见你说 Java 乱 |
![]() | 6 Maboroshii 2024-09-03 18:13:32 +08:00 ![]() yield 绝对算一个 |
![]() | 7 Building 2024-09-03 18:15:51 +08:00 ![]() Process 懂了 Thread 懂了 Queue 懂了 Group 懂了 Atom 懂了 Lock 懂了 Await/Async 懂了 Promise 懂了 Callback 懂了 当你把他们放在一起的时候... |
![]() | 8 nagisaushio 2024-09-03 18:17:23 +08:00 via Android ![]() 难懂概念千千万,rust haskell 占一半 |
9 zeonluang 2024-09-03 18:20:31 +08:00 ![]() js 里的原型和 promise 把 |
10 pisc 2024-09-03 18:30:28 +08:00 ![]() Monad 有啥难理解的? A monad is just a monoid in the category of endofunctors, what’s the problem? 想要实用一点的理解? A monad is just a typeclass with the three laws ! 还是不太好理解? A monad is just the bind/flatMap !!! |
11 0d 2024-09-03 18:34:12 +08:00 tokio |
![]() | 12 JackYao 2024-09-03 18:34:39 +08:00 @Maboroshii +1 当年理解这货 废了我好多脑细胞 |
![]() | 13 passive 2024-09-03 18:45:10 +08:00 via Android cps 、monad 这些都简单。 #define 宏替换比较绕 |
![]() | 14 kissmenow 2024-09-03 18:46:38 +08:00 golang 的指针传参 |
![]() | 15 dapang1221 2024-09-03 18:47:57 +08:00 yield ,最开始接触的时候寻思这是啥破玩意,理解之后恍然大悟,惊为天人 |
![]() | 16 lonelee 2024-09-03 19:00:13 +08:00 自旋锁/偏向锁 |
17 csys 2024-09-03 19:05:07 +08:00 |
![]() | 18 Wh1t3zZ 2024-09-03 19:12:32 +08:00 yield |
![]() | 19 caqiko 2024-09-03 19:18:50 +08:00 via Android ![]() 泛型类和具体实现类 看的迷迷糊糊的 |
![]() | 20 PTLin 2024-09-03 19:25:55 +08:00 学 c 的时候是指针。 学 python 的时候是 generator 和 async await 。 学 rust 的时候是所有权和生命周期。 学 Haskell 的时候是 reader applicative/monad/,monad transformer 。 |
![]() | 21 AV1 2024-09-03 19:32:36 +08:00 ![]() @vfs 如果你从来只写过 java ,可能确实就会觉得函数作为返回值、参数、变量,是无法理解的事情。 反过来也一样,学过其他语言(尤其函数是一等公民的语言)的人看 java ,也会很困惑 java 这边为了传递 callback ,还要整出依赖注入、控制反转这些设计模式。 |
![]() | 22 netabare 2024-09-03 19:35:49 +08:00 via iPhone DDD 和六边形那套东西,函数式编程的概念反而没什么难的 |
23 GuardX 2024-09-03 19:41:31 +08:00 reactor 那套,比如背压。。 |
![]() | 25 xuanbg 2024-09-03 20:11:03 +08:00 其实不是概念难以理解,更多的是名词难以理解。譬如 JS 的原型链和闭包 |
26 wangjh0802 2024-09-03 20:14:34 +08:00 ![]() 就没人提 控制反转 和 依赖注入吗 哈哈哈哈哈哈哈 |
![]() | 27 Kaiv2 2024-09-03 20:23:12 +08:00 @DOLLOR 不能这么说返回参数是函数和函数参数是函数,当作是匿名 class 就理解了。而且 Java8 就有了 lambda |
28 TWorldIsNButThis 2024-09-03 20:36:30 +08:00 via iPhone ![]() 闭包是穷人的对象 对象是穷人的闭包 |
![]() | 29 nagisaushio 2024-09-03 20:41:04 +08:00 via Android 楼主想要讨论编程语言概念,但楼上说的有些并不是编程语言概念 |
30 johnhsh 2024-09-03 21:08:27 +08:00 闭包 |
![]() | 31 R4rvZ6agNVWr56V0 2024-09-03 21:25:51 +08:00 C++ 的模版、预编译指令 |
![]() | 32 povsister 2024-09-03 21:29:08 +08:00 Makefile |
![]() | 34 rabbbit 2024-09-03 21:35:47 +08:00 ![]() 指针 函数式编程 ts 类型体操 |
![]() | 35 M4n5ter 2024-09-03 22:11:57 +08:00 第一眼看到 go1.23 有些丑陋的迭代器和其文档中给出的 example 时 |
![]() | 38 echoless 2024-09-03 22:33:01 +08:00 我觉得没有难的概念, 只是大部分人(包括很多知名教授)没有把一个概念解释清楚的能力. 我看递归, Monad, 都是看多个资料慢慢懂得. 你要懂 C. 可能需要你先了解 A, B, 但是你可能不懂 A, 或者你知道 B’. 但是很多资料(或者老师), 给所有人直接讲 C. 那么就是恰好了解 A, B 的人明白了 C. 因为你不懂 A, 了解 B’, 又干扰了你了解 B. 所以会觉得 C 很难. 教学是 1 对 1 的. 需要知道学习的人的状态, 要学习的概念. 跟化学反应一样, 要把所有的条件都达到, 才能进入下一步. |
![]() | 39 echoless 2024-09-03 22:40:19 +08:00 @levelworm #37 这个绝对是那些追求 Pure functional 的把函数编程给弄的阳春白雪了. pure functional 代价很大. 但是函数编程思想倒是很容易理解, 根本在于对状态(state)的处理上. C 语言可以 OOP 也可以 FP. 追求 pure OOP 或者 pure FP 就意义不大. |
![]() | 40 echoless 2024-09-03 22:42:48 +08:00 插一句, 我想象中科班和非科班的 CS 区别, 在于编程语言理论, 计算理论. 但是实际上, 无论科班和非科班, 99.99%的人都是刷题, 被八股文, 搞我这个非科班的也可以滥竽充数. |
![]() | 41 yb2313 2024-09-03 22:43:39 +08:00 今天看 go 那个生成器看晕了, 最后才发现我看漏了, 是个语法糖 |
![]() | 44 aliensb 2024-09-03 23:00:36 +08:00 erlang 这都是啥 |
45 Acsw 2024-09-03 23:05:37 +08:00 闭包,内存屏障 |
![]() | 46 kinkin666 2024-09-03 23:24:44 +08:00 高三结束准大学生的时候去新华书店看《 C#入门经典(第四版)》看到第六章泛型,卡在那里卡了一个星期,有一天一瓶可乐干下去,悟了,这就是把类型当参数!!! 下一次再这么悟是在学高数下册和离散数学的时候,高数里三层积分里面那个函数我就当它是回调函数了、离散数学和线性代数里那些东西我就当他是 C++里的运算符重载了 haskell 、scala 、f#、pearl 这些东西没用过,粗看一眼看不懂 |
![]() | 47 raptor 2024-09-03 23:37:21 +08:00 印象中第一个这种坎是二十多年前在汇编语言的保护模式,后来搞懂了。第二个这种坎是十几年前 C++的 TMP ,后来放弃了 C++。 |
48 purringpal 2024-09-03 23:46:32 +08:00 via iPhone 可以考虑备注一下大学专业和工作年限,作为科班毕业来说,完全 get 不到楼上说的这些困扰~ |
![]() | 49 yafoo 2024-09-04 00:03:47 +08:00 via Android yield |
50 qinfensky 2024-09-04 00:19:41 +08:00 via iPhone Macro |
51 spidah 2024-09-04 00:24:13 +08:00 monad |
53 NoOneNoBody 2024-09-04 01:15:30 +08:00 堆、栈 其实至今只能说知道大概 |
![]() | 54 iintothewind 2024-09-04 05:39:44 +08:00 CPS (Continuation-passing style) HOF(Higher-order function) 还有些其它的, 总之就是函数式编程真的很费脑子,不过挺好玩,逼格确实挺高的,就是工作中几乎用不上。 |
![]() | 55 busuzhike 2024-09-04 08:31:01 +08:00 python 的装饰 |
57 ZGame 2024-09-04 08:37:31 +08:00 @echoless #39 应该是说能把函数式写明白很难。函数式增加了很多约束,如果编程的时候按照相关规范去做,思维负担会减轻,局部查看每个函数的时候只用关系入参和出参对不对。 然后现实是因为约束的原因,取巧或者工期赶,有的变量直接就透传进来,然后就变成了使用函数式的方式,写出了非函数式的代码,反而加重了局部查看代码时候的混乱度。另外类似 java 后端 rjdbc 函数式的 zip,merge 等等响应式的 api 在进行调试的时候,我个人感觉也没有传统的编程方式那样好调试 |
![]() | 59 nutting 2024-09-04 08:52:00 +08:00 js 的底层。异步啥的那些有点别扭 |
60 test4zhou 2024-09-04 08:54:41 +08:00 js 一些底层原理 |
61 diroverflow 2024-09-04 08:54:51 +08:00 指针这个概念主要是名字起的不好,其实不就是内存地址吗?学过汇编的都能理解 |
62 querysecret 2024-09-04 08:59:18 +08:00 ![]() 协变、逆变 |
![]() | 63 dododada 2024-09-04 09:01:32 +08:00 设计模式,太多了,很多死搬硬套,最怕那种一开口就是我觉得这个用什么什么模式比较好的,以前有个同事,不管什么语言,上来就是设计模式,头大 |
![]() | 64 a1b2c3T 2024-09-04 09:02:19 +08:00 我感觉大部分设计模式都不是太好理解,可能单独看示例 i 还可以,但是自己用的时候就不大行了。 |
![]() | 66 xntzmk 2024-09-04 09:11:00 +08:00 @Maboroshii 赞同,还好后面 async 冒出来了 |
67 lew1 2024-09-04 09:11:12 +08:00 套接字 |
68 shangyu7 2024-09-04 09:21:21 +08:00 "对象" |
![]() | 69 theprimone 2024-09-04 09:27:19 +08:00 ![]() ”运行时“,本科相当长一段时间没懂啥意思 |
70 CREEPER5 2024-09-04 09:30:08 +08:00 右值引用,每次看的时候觉得自己理解了,事后发现并没有 |
![]() | 72 p1gd0g 2024-09-04 09:33:19 +08:00 刚入行搞不懂 interface ,业务写多了自然也就明白了 |
![]() | 73 Fallever 2024-09-04 09:34:01 +08:00 逆变和协变 对于人来说这是很自然的转换. 但是到泛型里再加上拗口的翻译 真的绕晕了 |
74 coderzhangsan 2024-09-04 09:34:35 +08:00 @theprimone +1 runtime 看中文教材很难理解,可能是最早接触并翻译的人,没有系统性的理解,犯了民科的毛病,类似的还有所谓 TCP 粘包。 |
![]() | 75 sunrain 2024-09-04 09:34:51 +08:00 刚学 OC 的时候吧,这是什么鬼?! |
![]() | 76 L5tEU4WX072p5P42 2024-09-04 09:36:50 +08:00 via Android 我自己最近的新发现: 符号越多,看着越难 直接用关键词,就好理解多了 |
![]() | 78 qW7bo2FbzbC0 2024-09-04 09:41:21 +08:00 @vfs 我在 go 里面遇到这种情况最多。。。 |
79 jheroy 2024-09-04 09:41:49 +08:00 过程式编程都不算啥,去看下 erlang 这种纯函数式编程才知道啥叫难理解,什么高阶函数什么单次赋值就不说了,就尾递归这概念就比较难理解。虽然纯函数编程数学上完美,就是不是按人好理解设计的,不过学数学专业出身的应该很喜欢。 |
![]() | 80 loryyang 2024-09-04 09:43:20 +08:00 c++ 元编程见过吗? |
![]() | 81 aleimu 2024-09-04 09:47:42 +08:00 一通百通 |
![]() | 82 opengps 2024-09-04 09:48:17 +08:00 竟然没人说:完成端口 |
83 neimengwuyanzu 2024-09-04 09:49:50 +08:00 @csys lambda 真的就是 写时候还行 写完过段时间在回头看 自己写的读起来有点费劲 |
![]() | 84 LitterGopher 2024-09-04 09:54:13 +08:00 套接字+句柄 (我觉得是翻译问题,你要说是网络通讯和指针我当场就能理解) |
![]() | 85 me1onsoda 2024-09-04 09:54:37 +08:00 自从我开始写 go ,我发现我对 interface 一无所知 |
![]() | 86 davin 2024-09-04 09:56:41 +08:00 说多了都是语法糖 |
![]() | 87 javazero 2024-09-04 09:59:05 +08:00 via Android rust 的特征?我不是科班出身,只会 Python 。想学点底层的,看到特征想着以后再看,结果再也没看过了哈哈 |
![]() | 88 EndlessMemory 2024-09-04 09:59:05 +08:00 promise.then |
![]() | 89 Subfire 2024-09-04 09:59:58 +08:00 ![]() "你们自己先入为主地错误地认为 send 与 recv 是一一对应的, 从而生造出"TCP 黏包"这种东西, 还有理了吗?" |
90 aloxaf 2024-09-04 10:00:01 +08:00 Memory Order |
![]() | 91 inhzus 2024-09-04 10:00:38 +08:00 C++ coroutine 提案 |
![]() | 92 winglight2016 2024-09-04 10:02:57 +08:00 scala 的柯里化阻止了我学习 Scala |
93 leona723 2024-09-04 10:03:48 +08:00 递归,每次做这个我感觉我就进入了无限循环的时空里 |
94 yazinnnn0 2024-09-04 10:05:24 +08:00 谁能解释一下 call/cc 看过一些解释 call/cc 的文章, 我对这个概念的理解还停留在 "砸哇噜多" 阶段 |
![]() | 96 KFCVIVO50 2024-09-04 10:18:59 +08:00 异步+事件循环 |
![]() | 97 FYFX 2024-09-04 10:19:16 +08:00 continuation , |
![]() | 98 qbmiller 2024-09-04 10:19:50 +08:00 python 的异步 |
![]() | 99 17681880207 2024-09-04 10:28:12 +08:00 @kissmenow 传指针其实就是传内存地址吧,这么理解 |
100 Dcrclub 2024-09-04 10:34:17 +08:00 难以理解的东西, 基本都是故意为之, 目的就是增加编程的入门门槛, 很多能用白话解释的东西. 故意弄个晦涩难懂的词,搞到这里, 有的还是用英文表示. 显得很高大上 |