首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >fp:我如何将嵌套的‘I’/‘ts’“拉”到外部类型?

fp:我如何将嵌套的‘I’/‘ts’“拉”到外部类型?
EN

Stack Overflow用户
提问于 2021-04-23 03:37:04
回答 2查看 785关注 0票数 1

我正在学一些fp-ts。要创建我正在处理的问题的样式化版本,假设我想要创建一个不存在的表,所以我必须查询数据库:一个易出错的异步操作。如果该表不存在,我希望创建它:另一个错误的异步操作。进一步假设错误类型都是字符串(如果需要的话,我还想知道如何创建一个联合错误类型),并且成功创建时返回的值是一个数字ID。

简而言之,看看表是否在那里,如果没有,就创建它--在整个过程中都有出错的可能。关键是我希望两个错误都反映在最外层的类型:一个TaskEither<string, Option<number>>中。问题是,我不知道如何避免获得TaskEither<string, Option<TaskEither<string, number>>>。也就是说,我不知道将错误拉到Option内部并将其合并为最外层错误的最佳方法。

(也许这涉及序列或可遍历?我还在学习这些。)

关于一些代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import { taskEither as TE, option as O } from "fp-ts";
import { pipe } from "fp-ts/lib/function";

// tableExists: () => TE.TaskEither<string, boolean>
// createTable: () => TE.TaskEither<string, number>

// I want this to represent both possible errors. Currently a type error.
// -------------------------------vvvvvv
const example = (): TE.TaskEither<string, O.Option<number>> => {
  return pipe(
    tableExists(),
    // How to pull the possible `left` up to the outermost type?
    // ------------------------------------------vvvvvvvvvvvvv
    TE.map((exists) => (exists ? O.none : O.some(createTable()))
  );
};
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-04-26 12:51:37

我想我想明白了,当然欢迎任何更正。

与其将TaskEitherOption中“拉”出来,我认为我需要将Option“推”到嵌套的TaskEither中,以便嵌套将TaskEither的各层放在一起,从而允许通过chain将它们压平。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const example = (): TE.TaskEither<string, O.Option<number>> =>
  pipe(
    tableExists(),
    TE.chain((exists) =>
      exists
        ? TE.of(O.none)
        : pipe(
            createTable(),
            TE.map(O.of)
          )
    )
  );

如果错误类型不同,我会做些什么,这似乎也是由这段代码处理的,但TE.chainW代替了TE.chain

票数 1
EN

Stack Overflow用户

发布于 2021-04-26 13:13:34

似乎您自己解决了这个问题:)如果有帮助,我已经将错误实现为一个受歧视的联合,这样您就可以很容易地识别在调用example时发生了哪些错误。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import * as TE from 'fp-ts/lib/TaskEither'
import * as O from 'fp-ts/lib/Option'
import { pipe } from "fp-ts/lib/function";

declare const tableExists: () => TE.TaskEither<string, boolean>
declare const createTable: () => TE.TaskEither<string, number>

// Discriminated union so you can easily identify which error it is
type ExampleErr = { tag: "TableExistsError", error: unknown } | { tag: "CreateTableError", error: unknown }

const example = (): TE.TaskEither<ExampleErr, O.Option<number>> => {
  return pipe(
    tableExists(),
    TE.mapLeft(error => ({ tag: "TableExistsError" as const, error })),
    TE.chainW(exists => exists ?
      TE.right(O.none) :
      pipe(
        createTable(),
        TE.mapLeft(error => ({ tag: "CreateTableError" as const, error })),
        TE.map(O.some)
      )
    )
  );
};

如果来自chainWcreateTable的错误类型不同,您正确地识别了需要使用createTableWfp-ts中函数末尾的意思是“加宽”,它通常允许将类型扩大到两种类型的合并。对于chainW for TaskEither,这意味着错误类型将成为两个TaskEither类型(进入chainW的类型和在其中返回的类型)的联合。

理解何时使用map和何时使用chain是一个重要的基本概念,这对于很好地理解非常重要。map允许您修改结构中的值,它是来自A -> B的一个简单函数。chain允许您执行另一个依赖于第一个结果的效果,因此您必须返回一个值,该值由您所处理的相同效果包装。在本例中,您使用的是TaskEither,因此传递给chain的函数也需要类型为A -> TaskEither<E, B> ( createTable是,但也需要手动处理表已经存在的情况,并使用TE.right(O.none)TE.of(O.none)在那里构造TaskEither )。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67229271

复制
相关文章
jQuery 效果 – 淡入淡出
通过 jQuery,我们可以实现元素的淡入淡出效果。在jQuery中有四个方法,分别是fadeIn(),fadeOut(),fadeToggle(),fadeTo(),下面来分别介绍一个这四个方法的使用以及参数设置。
OECOM
2020/07/02
2.9K0
图片轮播(淡入淡出)--JS原生和jQuery实现
图片轮播(淡入淡出)--js原生和jquery实现 图片轮播有很多种方式,这里采用其中的 淡入淡出形式 js原生和jQuery都可以实现,jquery因为封装了很多用法,所以用起来就简单许多,转换成js使用,其实也就是用js原生模拟出这些用法。 但不管怎样,构造一个最基本的表现层是必须的
书童小二
2018/09/03
24.1K0
图片轮播(淡入淡出)--JS原生和jQuery实现
jquery循环 each()
对jquery选择的对象集合分别进行操作,需要用到jquery循环操作,此时可以用对象上的each方法:
Devops海洋的渔夫
2019/05/30
2.1K0
Jquery 跳出循环
今天写jquery的时候,遇到写神奇的问题,给input的value赋值,用val和prop都不行,最后用attr才改变了。
全栈程序员站长
2022/08/23
3.1K0
Jquery 跳出循环
jQuery循环翻页
在使用jQuery时,经常会遇到需要实现循环翻页的需求,例如在一个包含多个页面的网站中,通过点击按钮或滚动到页面底部触发翻页功能。
堕落飞鸟
2023/05/18
1.4K0
【jQuery动画】停止动画、淡入淡出、自定义动画
使用动画的过程中,如果在同一个元素上调用一个以上的动画方法,那么对这个元素来说,除了当前正在调用的动画,其他的动画将被放到效果队列中,这样就形成了动画队列。
颜颜yan_
2022/12/01
2.5K0
【jQuery动画】停止动画、淡入淡出、自定义动画
jQuery 图像裁剪插件Jcrop
Jcrop简介 Jcrop 是一个功能强大的 jQuery 图像裁剪插件,结合后端程序(例如:PHP)可以快速的实现图片裁剪的功能。 Jcrop是一款免费的软件,采用MIT License发布。
静默虚空
2018/01/05
1.8K0
jQuery 图像裁剪插件Jcrop
ajax请求接口,jquery拼接数据循环
关于上一篇写的文章,jquery拼接数据循环一个数据列表:https://www.jianshu.com/p/d4034550fcf3。如果把json写在接口数据里面,使用ajax来调用,又该怎么样的使用?其实也很简单,首先将数据写在data.json文件里面,使用ajax的url请求之后,进行拼接即可。
王小婷
2019/07/10
3.1K0
ajax请求接口,jquery拼接数据循环
JavaWeb——JQuery之高级操作应用及实践案例总结(动画、遍历、事件绑定)
【注意】:如果遍历中加判断条件,当前function返回为false,则结束循环(相当于js中使用的break),如果返回为true,则结束本次循环,继续下次循环(相当于js中使用的continue);
Winter_world
2020/09/25
9.4K0
JavaWeb——JQuery之高级操作应用及实践案例总结(动画、遍历、事件绑定)
Android动画之淡入淡出
为了更好的说明Android动画的淡入淡出效果,这里以一个场景为例: 界面上有两个View 控件,两个View交替显示,当一个View淡入显示,另一个View淡出不可见。
我思故我在
2022/05/07
1.5K0
JQuery高级应用
toggle([speed],[easing],[fn]) :切换,显示则隐藏,隐藏则显示
乐心湖
2021/01/18
5.9K0
JQuery高级应用
bxslider使用帮助
“bxSlider”就是一款响应式的幻灯片js插件 bxSlider特性 充分响应各种设备,适应各种屏幕; 支持多种滑动模式,水平、垂直以及淡入淡出效果; 支持图片、视频以及任意html内容; 支持触摸滑动; 支持Firefox,Chrome,Safari,iOS,Android,IE7+ bxSlider使用方法: 加载jQuery库,加载bxSlider插件文件和相关CSS文件; <!-- bxSlider CSS file --> <link href="jquery.bxslider
菲宇
2022/12/21
1.5K0
jquery freemarker模板设置变量每次循环加1
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/106226.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/05
1.6K0
前端系列 |原生JS和jQuery循环遍历函数
之前总是不清楚原生JS和jQuery中有哪些循环遍历函数,而且有时候还总是把原生JS方法当成jQuery方法来用,以致于项目总是报错,并且还不知道是什么原因。所以,觉得有必要总结出来,区分一下。
Tinywan
2020/07/23
6.7K0
前端系列 |原生JS和jQuery循环遍历函数
JQuery跳出each循环的方法(包含数组遍历)
break----用return false;  continue --用return ture;
ydymz
2018/09/10
2.9K0
jQuery
jquery 语法是为HTML元素的选取编制的,可以对元素执行某些操作。 基础语法就是:$(selector).action()
仇诺伊
2018/09/12
4.3K0
[Android笔记6]之淡入淡出动画TransitionDrawable
地址 GitHub 地址:http://blog.csdn.net/xiangyong_1521/article/details/77888295 由于最近在赶公司项目,闲余时间不是很充沛,本节就实现一个简单的动画吧。 说到淡入淡出动画,首先想到补间动画里面的AlphaAnimation,不过这个深浅动画只能对透明度做渐变效果,也就是只能对一个图形做深浅的颜色变换。如果我们想要从A图片逐渐变为B图片,也就是要实现淡入淡出(Fade-in and Fade-out)效果时,TransitionDrawable
项勇
2018/06/19
1.8K0
jQuery实现点击图标div循环放大缩小功能
很基础的一个功能,点击左下角的图标按钮,地图的整个div会变大,变大预览之后,再次点击图标按钮,地图的整个div会变小,恢复原样,两个图标在地图界面的放大和缩小时间不断的切换图标状态(箭头向里面,或者箭头向外面)
王小婷
2018/09/26
3.8K0
jQuery实现点击图标div循环放大缩小功能
点击加载更多

相似问题

jquery循环淡入淡出ie jpg图像

11

悬停时的jQuery循环淡入淡出图像

10

jquery淡入淡出循环

12

JQuery淡入淡出循环太慢

40

jQuery连续淡入淡出循环

30
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文