Luk*_*ams 0 haskell functional-programming immutability typescript elm
我们正在将我们的命令性大脑转变为功能最强大的范例.这个功能给我带来了麻烦.我想要构造的阵列,要么包括两对对或三对,根据条件(是否refreshToken是null).如何使用FP范例干净利落地完成这项工作?当然,对于命令式代码和变异,我只是有条件地.push()将额外的值放到最后看起来非常干净.
这是"本地突变是否正确"FP警告的一个例子?
(我们ReadonlyArray在TypeScript中使用强制实现不变性,这使得它更难看.)
const itemsToSet = [
[JWT_KEY, jwt],
[JWT_EXPIRES_KEY, tokenExpireDate.toString()],
[REFRESH_TOKEN_KEY, refreshToken /*could be null*/]]
.filter(item => item[1] != null) as ReadonlyArray<ReadonlyArray<string>>;
AsyncStorage.multiSet(itemsToSet.map(roArray => [...roArray]));
Run Code Online (Sandbox Code Playgroud)
itemsToSetOP中给出的错误是什么?它看起来很实用,但可能是因为我对TypeScript缺乏了解.
在Haskell中,没有null,但是如果我们使用Maybe第二个元素,我认为itemsToSet可以转换为:
itemsToSet :: [(String, String)]
itemsToSet = foldr folder [] values
where
values = [
(jwt_key, jwt),
(jwt_expires_key, tokenExpireDate),
(refresh_token_key, refreshToken)]
folder (key, Just value) acc = (key, value) : acc
folder _ acc = acc
Run Code Online (Sandbox Code Playgroud)
这里jwt,tokenExpireDate和refreshToken是所有类型的Maybe String.
itemsToSet执行右折叠过values,模式匹配的Maye String对元件Just和(隐含地)Nothing.如果它是一个Just值,它将该(key, value)对与累加器相关联acc.如果没有,folder只需返回acc.
foldrvalues从右到左遍历列表,在访问每个元素时构建累加器.初始累加器值是空列表[].
在函数式编程中不需要"局部变异".通常,您可以通过使用递归和引入累加器值来将"局部变异"重构为正确的函数样式.
虽然foldr是内置函数,但您可以使用递归自己实现它.