Twlig / issuesBlog

MIT License
3 stars 0 forks source link

代数效应 #109

Open Twlig opened 2 years ago

Twlig commented 2 years ago

代数效应

代数效应函数式编程中的一个概念,用于将副作用函数调用中分离。

function getPicNum(name) {
  const picNum = perform name;
  return picNum;
}

try {
  getTotalPicNum('kaSong', 'xiaoMing');
} handle (who) {
  switch (who) {
    case 'kaSong':
      resume with 230;
    case 'xiaoMing':
      resume with 122;
    default:
      resume with 0;
  }
}

上面是虚构的语法。当执行到getTotalPicNum内部的getPicNum方法时,会执行perform name

此时函数调用栈会从getPicNum方法内跳出,被最近一个try...handle捕获。类似throw Error后被最近一个try...catch捕获。

类似throw ErrorError会作为catch的参数,perform namename会作为handle的参数。

try...catch最大的不同在于:当Errorcatch捕获后,之前的调用栈就销毁了。而handle执行resume后会回到之前perform的调用栈。

对于case 'kaSong',执行完resume with 230;后调用栈会回到getPicNum,此时picNum === 230

总结代数效应能够将副作用(例子中为请求图片数量)从函数逻辑中分离,使函数关注点保持纯粹。只关注从getPicNum拿到了什么,而不关注它的执行过程和产生的异步副作用。

代数效应在React中的应用

那么代数效应React有什么关系呢?最明显的例子就是Hooks

对于类似useStateuseReduceruseRef这样的Hook,我们不需要关注FunctionComponentstateHook中是如何保存的,React会为我们处理。

我们只需要假设useState返回的是我们想要的state,并编写业务逻辑就行。

function App() {
  const [num, updateNum] = useState(0);

  return (
    <button onClick={() => updateNum(num => num + 1)}>{num}</button>  
  )
}

原文链接https://react.iamkasong.com