首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >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

复制
相关文章
UIWebView 网页播放视频崩溃问题
UIWebView 加载网页可以,但播放网页里面的视频就崩溃。 一点击播放视频就崩溃 UIWebView 加载网页内容 崩溃如图: 崩溃图
LeeCen
2018/10/11
1.1K0
UIWebView 网页播放视频崩溃问题
浅谈iOS中WKWebView和UIWebView的清除缓存问题
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/53943101
用户1451823
2018/09/13
5.3K0
UIWebView的使用
@interface ViewController ()<UIWebViewDelegate> @property (weak, nonatomic) IBOutlet UIBarButtonItem backItem; @property (weak, nonatomic) IBOutlet UIBarButtonItem forwardItem; @property(nonatomic,weak)UIWebView * webView; (IBAction)back; (IBAction)forwar
大师级码师
2021/10/31
4470
UIWebView的使用与总结
hh.jpeg 先前在项目中使用了UIWebView 在项目中一些比较复杂的UI布局、需后台灵活控制的界面、原网页,可以考虑UIWebView 在用它之前跟大家说下它的优缺点 优点: 可跨平台 开发一次可以部署iOS、Android等平台。 发布更新快 在服务器端发布,能够实时更新终端展示,便于快速升级以及紧急修复bug 排版布局能力强 强大的HTML+CSS让人膜拜 缺点: 性能 相对于原生的app来说,使用UIWebView的app相对来说性能会低一点,
Bison
2018/06/28
5830
UIWebView自适应高度
//webview自适应高度 delegate里面实现 (void)webViewDidFinishLoad:(UIWebView *)webView { NSString *height_str= [webViewstringByEvaluatingJavaScriptFromString: @"document.body.offsetHeight"]; heightCell = [height_str intValue]; webView.frame = CGRectMake(0,0,
用户8671053
2021/10/29
8340
使用WKWebView替换UIWebView
代理方法 添加引用 import WebKit 代理 WKNavigationDelegate 页面加载状态的回调 代理方法 func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) { } func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) { } func webView(_ w
码客说
2019/10/22
1.9K0
iOS中解码.txt文件在UIWebView出现中文乱码的问题
1,什么是gbk和utf-8编码? 2,GBK与UTF-8的区别? 1,GBK的文字编码是双字节来表示的,即不论中、英文字符均使用双字节来表示,只不过为区分中文,将其最高位都定成1。 至于UTF-8编码则是用以解决国际上字符的一种多字节编码,它对英文使用8位(即一个字节),中文使用24位(三个字节)来编码。对于英文字符较多的论坛则用UTF-8节省空间。 2,GBK包含全部中文字符; UTF8是国际编码,它的通用性比较好,UTF-8则包含全世界所有国家需要用到的字符。 GBK是国家编码,通用性比UTF8
rectinajh
2018/05/17
3.3K0
iOS 修改UIWebView的UserAgent
iOS和H5交互的时候,H5需要用userAgent带一些参数,需要我们修改默认的UserAgent为自定义的。 首先,给大家普及一下userAgent的历史,点击UserAgent查看。 1 在Appdelegate里面register一个新的UserAgent //get the original user-agent of webview UIWebView *webView = [[UIWebView alloc] initWithFrame:CGRectZero]; NSStrin
王大锤
2018/05/17
1.4K0
UI篇- UIWebView使用大全
UIWebView是常用开发控件,对于一些常用的设置是有必要记住或者记录下来的。 这里特别说一下,对于一个工程中整个就是一个WebView的情况,你可以通过一些设置来使整个工程显得接近于原生开发的APP,这样你是有机会被审核通过的。
進无尽
2018/09/12
2K0
UI篇- UIWebView使用大全
IOS 使用UIWebView加载网页
1 class ViewController:UIViewController, UIWebViewDelegate { 2 3 override func viewDidLoad() { 4 super.viewDidLoad() 5 // Do any additional setup after loading the view, typically from a nib. 6 7 let bounds = UIScreen.main.bounds 8 let frame = CG
用户5760343
2019/07/08
1.1K0
UIWebView与JS的交互
要实现这样一个需求:按照本地的CSS文件展示一串网络获取的带HTML格式的只有body部分的文本,需要自己拼写完整的HTML。除此之外,还需要禁用获取的HTML文本中自带的 < img > 标签自动加载,并把下载图片的操作放在native端来处理,并通过JS将图片在Cache中的地址返回给UIWebview。
用户2491699
2018/08/02
3.7K0
UIWebView与JS的交互
【IOS开发基础系列】UIWebView专题
iOS: UIWebview loadhtmlstring & Local css/js/imageresources
江中散人_Jun
2023/10/16
3920
【IOS开发基础系列】UIWebView专题
IOS UIWebView自己编写页面样式
1 class ViewController:UIViewController { 2 3 var webView:UIWebView! 4 override func viewDidLoad() { 5 super.viewDidLoad() 6 7 let bounds = UIScreen.main.bounds 8 let frame = CGRect(x:0, y:40, width:bounds.width, height:bounds.height-40) 9 webVie
用户5760343
2019/07/08
6600
【iOS开发】从 UIWebView 到 WKWebView
①本文章适合有 UIWebView 基础的人看,如果实在没用过的话,至少你要知道 UIWebView 是个什么东西。
KyXu
2019/04/11
1.8K0
iOS小技能:UIWebView 被拒的解决方案(用更安全的WKWebView替代UIWebView)
AXWebViewController (0.7.2) 使用了NJKWebViewProgress iOS8.0以下使用了NJKWebViewProgress作为进度条, 因此对于上架审核没有影响。
公众号iOS逆向
2022/12/19
3.3K0
iOS小技能:UIWebView 被拒的解决方案(用更安全的WKWebView替代UIWebView)
iOS UIWebView禁用长按选中的交互
最近有个项目,uni-app写代码逻辑,实现多端复用,iOS端直接加载uni-app生成的H5页面。
动动我试试
2020/05/04
1.7K0
iOS 拦截UIWebView 内容的点击事件
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType { //判断是否是单击 if (navigationType == UIWebViewNavigationTypeLinkClicked){ NSString *url = [request.
GuangdongQi
2018/10/10
2.4K0
iOS中UIWebView的使用详解 原
     UIWebView继承与UIView,因此,其初始化方法和一般的view一样,通过alloc和init进行初始化,其加载数据的方式有三种:
珲少
2018/08/16
8040
iOS中UIWebView的使用详解
                                                                            原
IOS开发系列——UIWebView专题【整理,部分原创】
iOS: UIWebview loadhtmlstring & Localcss/js/image resources
江中散人_Jun
2022/03/08
9500
IOS开发系列——UIWebView专题【整理,部分原创】
UIWebview与OC交互以及加载失败
Simulator Screen Shot 2016年4月16日 00.27.57.png
Python疯子
2018/09/06
1.2K0
UIWebview与OC交互以及加载失败

相似问题

UIWebview问题

12

UIWebView url问题

10

NSAppTransportSecurity UIWebView问题

12

uiwebview会话问题

10

UIWebView内存问题

20
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

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