首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

深圳scala-meetup-20180902(3)- Using heterogeneous Monads in for-comprehension with Monad Transformer

scalaOption类型是个很好用数据结构,用None来替代javanull可以大大降低代码复杂性,它还是一个更容易解释状态表达形式,比如在读取数据时我们用Some(Row)来代表读取数据行...由此我们可以对数据库操作结果有一种很直观理解。同样,我们又可以用EitherRight(Row)来代表成功运算获取了结果Row,用Left(Err)代表运算产生了异常Err。...在Task[Either[E,Option[A]]]这个复合类型组成类型Option[A],Either[E,A]实际上是包嵌A类型元素不同管道,各自可以独立支持Monadic编程,如下: object...不过cats函数组件库提供了OptionT,EitherT这两个Monad Transformer,它们类型款式如下: final case class OptionT[F[_], A](value:...E,Option[A]]] => OptionT[EitherT[Task,E,A],A] Monad Transformer包嵌类型正是我们需要类型,我们可以用Task来代表F[_]。

40420

理解ScalaSymbol类型

相信很多人和我一样,在刚接触Scala时,会觉得Symbol类型很奇怪,既然Scala字符串都是不可变,那么Symbol类型到底有什么作用呢?     ...简单来说,相比较于String类型,Symbol类型有两个比较明显特点:节省内存和快速比较。在进入正题之前,让我们先来了解一下JavaStringintern()方法。...节省内存     在Scala,Symbol类型对象是被拘禁(interned),任意同名symbols都指向同一个Symbol对象,避免了因冗余而造成内存开销。...(实际上,String.equals方法会先比较引用是否相同,但是在运行时产生字符串对象,引用一般是不同) 三、Symbol类型应用     Symbol类型一般用于快速比较,例如用于Map...从这个角度看,ScalaSymbol类型不仅有效率上提升,而且也简化了编码复杂度。

1.5K30
您找到你想要的搜索结果了吗?
是的
没有找到

Scala篇】--Scala函数

一、前述 Scala函数还是比较重要,所以本文章把Scala可能用到函数列举如下,并做详细说明。 二、具体函数 1、Scala函数定义 ?...,要指定传入参数类型 方法可以写返回值类型也可以不写,会自动推断,有时候不能省略,必须写,比如在递归函数或者函数返回值是函数类型时候。  ...scala函数有返回值时,可以写return,也可以不写return,会把函数中最后一行当做结果返回。当写return时,必须要写函数返回值。...可以将匿名函数返回给val定义值 匿名函数不能显式声明函数返回类型 /** * 匿名函数 * 1.有参数匿名函数 * 2.无参数匿名函数 * 3.有返回值匿名函数...,函数返回是函数 因为函数返回是函数,所以可以理解为调用hightFunc2(1,2)返回是函数,所以需要在传进去一个参数。

1.4K10

简单理解scala闭包

闭包这个词大家都不陌生,尤其是做spark同学,经常会看到,但是很多人还是对闭包比较懵懂,就像前面说watermark一样,大家都很熟悉朗朗上口,但是又貌似一头雾水没有理解。...那么,浪尖今天就说说闭包~ 首先给出浪尖理解定义吧: 「函数」和「函数内部能访问到变量」(也叫环境)总和,就是一个闭包。 按照这个定义呢?...我看网上说闭包构造是: 闭包首先有函数嵌套,内部函数引用外部函数变量,然后返回是一个函数。...应该是这个样子: object closure { def main(args: Array[String]): Unit = { println(makeAdd()(1)) }...需要外部函数作用主要是隐藏变量,限制变量作用范围。 有些人看到「闭包」这个名字,就一定觉得要用什么包起来才行。其实这是翻译问题,闭包原文是 Closure,跟「包」没有任何关系。

1.3K10

Scala 高阶(十):Scala异常处理

Java异常处理有两种方式 try...catch和finally概述 finally重要面试题 三、Scala异常机制 ---- Scala异常机制语法处理上和 Java 类似,但是又不尽相同...Scala 异常工作机制和 Java 一样,但是 Scala 没有“checked(编译期)”异常,即 Scala没有编译异常这个概念,异常都是在运行时候捕获处理。...因此,在 catch 子句中,越具体异常越要靠前,越普遍异常越靠后,如果把越普遍异常写在前,把具体异常写在后,在 Scala 也不会报错,但这样是非常不好编程风格。...finally 子句用于执行不管是正常处理还是有异常发生时都需要执行步骤,一般用于对象清理工作,这点和 Java 一样。 用 throw 关键字,抛出一个异常对象。...它向调用者函数提供了此方法可能引发此异常信息。它有助于调用函数处理并将该代码包含在 try-catch块,以避免程序异常终止。在 Scala ,可以使用 throws 注解来声明异常。

97640

PHP shuffle 函数不能用于洗牌算法?

这将有助于我们更好地理解算法工作原理,并提高我们对牌型出现概率准确预测能力。...而在 shuffle ,while 循环使用 temp 变量类型为 zval,zval 是 PHP 底层一种变量类型。...由于 shuffle 是用于处理数组函数,因此使用 zval 类型更为合适。尽管两个函数使用变量类型不同,但它们所采用算法是相同。...另外,洗牌算法不仅用于洗牌,实际上它在许多其他随机处理场景也有应用。例如,负载均衡算法中就使用了洗牌算法。...这些都是我在查阅资料时看到,虽然没有亲自查看源码,但这些信息应该也能让我们更好地理解洗牌算法应用范围。 最后给一个结论,我自己认为 PHP shuffle 是适合当做洗牌算法!----

17210

C# 不能用于文件名字符

在 Windows 有一些字符是不能作为文件名,尝试重命名一个文件,输入/ 就可以看到windows 提示不能作为文件名字符 那么具体是包括哪些符号不能作为文件名?...Slash (/) Plus sign (+) Pipe (|) Quotation mark (") 上面这些字符不能用来文件名和文件夹名 而且在 windows 要求,文件是需要有文件名,虽然你也可以创建....file这样文件,但是用户是难以自己输入这样文件名。...之外还有一些文件名是保留,不能创建这样文件名 CON, PRN, AUX, CLOCK$, NUL COM0, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8...实际上微软已经做了这个了,因为在不同系统,可能之后会添加新字符串,所以最好不要自己写。

39820

Scala方法与函数

:方法名,符合Scala中标识符定义要求,一般采用小驼峰方式组织命名 fun后接一对小括号,用于接收一组参数定义 a:参数名,符合Scala中标识符定义要求 参数名Int:声明参数类型。...与Python可选声明参数类型不同是,Scala参数类型声明是必须项,而且程序编译时会执行类型检查(Python参数类型声明就是个形式,仅用于提示使用者而不做实际检查,挂羊头卖狗肉是可行)...:返回值类型,多数情况下可以省略,此时由编译器执行类型推断得出;但当方法存在递归调用时为必须项; 方法后=:用于赋值操作,相当于把方法体返回值赋予给调用该方法变量,特殊情况下可省略,此时无论方法体是否实际有返回结果...实际上这不是Scala特有的特性,即当方法体仅有单行代码时,无需显示写出大括号。这很容易理解:大括号作用是将一组代码囊括为一个整体,而当代码块仅有单行代码时自然可以缺省。...所以看到了英文写法,两个概念偏就很容易理解:与其翻译为"偏",实则表达含义是"部分"。

98110

C# 不能用于文件名字符

在 Windows 有一些字符是不能作为文件名,尝试重命名一个文件,输入/ 就可以看到windows 提示不能作为文件名字符 ? 那么具体是包括哪些符号不能作为文件名?...Slash (/) Plus sign (+) Pipe (|) Quotation mark (") 上面这些字符不能用来文件名和文件夹名 而且在 windows 要求,文件是需要有文件名,虽然你也可以创建...之外还有一些文件名是保留,不能创建这样文件名 CON, PRN, AUX, CLOCK$, NUL COM0, COM1, COM2, COM3, COM4, COM5, COM6, COM7, COM8...尝试新建一个文本,然后把他文件名命名为上面的任意一个,基本windows会说不能把文件命名 那么是不是把这些字符串拿出来判断?...欢迎转载、使用、重新发布,但务必保留文章署名林德熙(包含链接: https://lindexi.gitee.io ),不得用于商业目的,基于本文修改后作品务必以相同许可发布。

79420

SAP MM MIGO不能用于执行By-product收货?

D项目上对于工单多是有副产品(by-product)产生。 在执行工单入库时候,笔者有推荐客户使用MIGO来做。...因为笔者认为MIGO功能强大,用来取代老事务代码MB1A/MB1B/MB1C等等,觉得不应该还把那些SAP老不推荐事务代码介绍给客户。...但是笔者发现这个看起来强大MIGO,有个局限性就是不能用它来对工单执行by-product收货。 比如如下工单正常产出品料号是:991237501A,有副产品824890001(铜屑)。 ?...试图使用MIGO+531移动类型方式,来为该工单执行副产品收货, ? 系统还是带出了正常产出品991237501A,而不是副产品物料号,也就是说不能使用MIGO来对副产品做收货。...使用老事务代码MB1C就能成功执行副产品收货, ? By-products选项值设置成2, ? 保存即可。 看来MIGO这个无所不能事务代码并非真的无所不能

82320

理解Scala函数式风格:从var到val转变

如果你是从指令式背景转到Scala——例如,如果你是Java程序员——那么学习Scala是你有可能面对主要挑战就是理解怎样用函数式风格编程。...然而在Scala看来,val和var只不过是你工具箱里两种不同工具。它们都很有用,没有一个天生是魔鬼。Scala鼓励你学习val,但也不会责怪你对给定工作选择最有效工具。...尽管或许你同意这种平衡哲学,你或许仍然发现第一次理解如何从你代码中去掉var是很挑战事情。...重构后printArgs方法并不是纯函数式,因为它有副作用——本例,其副作用是打印到标准输出流。函数有副作用马脚就是结果类型为Unit。...本文节选自《Programming in Scala》 【相关阅读】 Scala编程实例:使用Set和Map Scala编程实例:使用List和Tuple Scala编程实例:带类型参数化数组

1.1K30

Scalaz(25)- Monad: Monad Transformer-叠加Monad效果

因为FP特征就是Monad式编程(Monadic programming),所以必须充分理解认识Monad、熟练掌握Monad运用。...值得注意是,Monad Transformer 类型构建是由内向外反向。比如上面的例子OptionT是个Monad Transformer,它类型款式是OptionT[M[_],A]。...而我们在操作时如在for-comprehension运算时使用类型则必须统一为OptionT[Either,A]。 我们如何去构建Monad Transformer类型值呢?...:Either[Option[A]]代表一个运算结果可以是成功right或者失败left,如果运算成功则返回一个结果或空值;而Option[Either[A]]从字面上理解好像是一个运算可以返回一个成功或失败运算又或者返回空值...的确,用Monad Transformer组合Monad后可以实现成员Monad效果叠加。 不过,在实际应用两层以上Monad组合还是比较普遍

75960
领券