A monad demo given by AI

// Generic Monad structure
class Monad {
  constructor(value) {
    this.value = value;
  }

  // Bind: chains computations that return a Monad
  bind(fn) {
    return fn(this.value);
  }

  // Unit: wraps a value in the Monad
  static of(value) {
    return new Monad(value);
  }

  // For debugging
  get() {
    return this.value;
  }
}

// Example: Maybe Monad
class Maybe extends Monad {
  bind(fn) {
    if (this.value == null) {
      return new Maybe(null);
    }
    return fn(this.value);
  }

  static of(value) {
    return new Maybe(value);
  }

  getOrElse(defaultValue) {
    return this.value == null ? defaultValue : this.value;
  }
}

// Demo: chaining computations with Monad
const double = x => Monad.of(x * 2);
const increment = x => Monad.of(x + 1);

const result = Monad.of(5)
  .bind(double)      // 10
  .bind(increment);  // 11

console.log(result.get()); // Output: 11

// Demo: chaining with Maybe Monad
const safeDivide = x => x === 0 ? Maybe.of(null) : Maybe.of(10 / x);

const maybeResult = Maybe.of(2)
  .bind(safeDivide)       // 10 / 2 = 5
  .bind(x => Maybe.of(x + 3)); // 8

console.log(maybeResult.getOrElse("fail")); // Output: 8

const maybeFail = Maybe.of(0)
  .bind(safeDivide)       // null
  .bind(x => Maybe.of(x + 3));

console.log(maybeFail.getOrElse("fail")); // Output: "fail"

maybe functor

class Maybe {
  constructor(value) {
    this.value = value;
  }

  // Functor map: applies a function if value is not null/undefined
  map(fn) {
    if (this.value === null) {
      return new Maybe(null);
    }
    return new Maybe(fn(this.value));
  }

  // getOrElse: safely extract value with a fallback
  getOrElse(defaultValue) {
    return this.value === null ? defaultValue : this.value;
  }

  // static helpers for convenience
  static of(value) {
    return new Maybe(value);
  }

  static nothing() {
    return new Maybe(null);
  }
}

// Example usage:
const maybeNumber = Maybe.of(5)
  .map(n => n * 2)
  .map(n => n + 1);

console.log(maybeNumber.getOrElse(0)); // Output: 11

const maybeNull = Maybe.of(null)
  .map(n => n * 2);

console.log(maybeNull.getOrElse(0)); // Output: 0

记一次花xxx块钱通过黄牛坐高铁

通过这次坐高铁,我觉得自己很机械,不会变通,黄牛出售的是一种思路,一种很普通简单的思路,感觉被收了智商税,书读了那么多年,反而像是被教育害了。社会让我们做一个守规矩的人,回头看,要懂得逾越规矩时,人已经老了。

人要有创新思维,打破常规。创业赚钱也是这个道理,工作中想要轻松的工作也是这个道理。

继续阅读“记一次花xxx块钱通过黄牛坐高铁”

我的高考

最近看了同事的一篇谈及自己高考的文章,想到了自己的高考。我是 2012 年参加高考的,过去了 13 年,但是你让我回忆高考那几天发生了什么,我却记忆犹新,恍如昨日。

高考一经考完,班里的同学都在组织聚会,觉得过了一个很大的人生节点,很有必要庆祝或者放纵一下。而我想的有点奇怪,觉得应该激流勇退,并没有参加那个晚上的 ktv ,至于那场聚会有多少荒诞不经或者洒泪留恋的场景就不得而知了。

继续阅读“我的高考”

一个前端组长要关注哪些东西?

团队

  1. 人才梯队培养:目前 ecad 团队缺乏中高级前端;
  2. 团队文化建设:软件追求高效,稳定;代码追求易读易维护易扩展;个人追求成长进步;
  3. 做好知识沉淀和积累:api 的稳定,团队分享,文档,code review;
  4. 团队目标制定:okr 的制定,以及协助团队实现。

产品

  1. 版本管理:实现既定目标的版本发布,需求的迭代管理;
  2. 产品定位:以用户视角考虑问题,明白产品要解决的核心问题,技术为产品服务;
  3. 构建产品的方法论:完成比完美重要,注重提炼核心需求和产品基础能力;
  4. 关注市场反馈:关注市场变化,市场数据,用户的反馈。

个人

  1. 沟通表达能力提升:清晰传达需求,向上管理预期,向下反馈问题,学会聆听;
  2. 领导力的建立:阅读一些管理类的书籍,更好的组织团队,带领团队;
  3. 思维转变:个人产出,变成团队产出;
  4. 专业知识学习:持续学习编程的基础知识。

自证陷阱

电影《让子弹飞》有一场很滑稽的戏,张默被人诬陷说吃了 2 碗的凉粉,却只给了 1 碗的钱,不公平。结果他剖腹自证,从胃里取出了一碗凉粉,他自证成功了,但是也失去了生命。自证的代价非常昂贵,得不偿失。

这场戏看起来很荒唐很戏剧,现实生活中似乎不会存在这样的事情。

不知道大家有没有遇到类似的场景,别人扣一个屎盆子在你头上,总是想着去辩解自己没有,而没有想过为什么不让对方提供证据证明你有。

人的思维总是很奇怪的,别人诬陷你,总想着去自证,结果越描越黑,进入了别人的节奏里。

能够打败魔法的,绝对也是魔法,而不是理性。掉入了别人的陷阱里,想爬出来也是非常困难的,最好的结果是提前不要掉入别人的陷阱。

商业逻辑里也是类似的,打败微信的不是更好的“微信”。

当别人想要和你论证 a 的时候,我们千万不要论证 a 的不合理性,转而论证 b 的合理性,反而能开拓一片新的天地。

婚姻中的静电效应

深圳的秋冬季,我经常被静电电到。电到杯弓蛇影的地步,一度不敢触摸金属物体。

后来,我学会了在用手触摸金属材质前,先把手机碰上去,这个时候就能看到一点火花和听到劈劈啪啪的声音,屡试不爽。然后再去开门,这样基本上不会被电到。

静电的杀伤力不强,何以对我产生如此强烈的震慑呢?

继续阅读“婚姻中的静电效应”

我的 2023

快忘记要总结一下我的 2023 了,因为宝子一直在身边,没有大块的时间,直到现在宝子回了老家。

用老婆的话来说,2023 是我的丰收年,怎么个丰收法呢,也许是这几个方面吧。

我结婚了,领了证,办了婚礼,同时我的娃儿也出生了,前几年我一直被困扰的烂尾楼,也最终没有烂尾的事实,虽然还存在着安全隐患。以前有一个很神奇的感受是,究竟怎么样的人会结婚生娃呢,现在想来,我这样的人也结婚生娃了。

继续阅读“我的 2023”