使用Scala实现Option数据结构

Windows下的Geant4安装教程 本教程将从0开始展示在Windows下如何安装Geant4,包括各种辅助工具(QT、Cmake、Visual Studio)的下载安装,环境变量的配置,以及example的生成等。 阅读详情

这个例子来源于scala圣经级教程《Functional Programming in Scala》,由于本人跟着书中的代码敲了一遍,然后写了点测试代码验证了一下正确性,所以就放在这做个备忘吧。贴出来只是为了方便自己得意,如果看不懂,但是又感兴趣的就去看原书吧偷笑偷笑偷笑。

package errorhandling
//hide std library `Option`, since we are writing our own
import scala.{Option => _}

sealed trait Option[+A] {

  def map[B](f: A => B): Option[B] = this match {
    case None => None
    case Some(a) => Some(f(a))
  }

  def getOrElse[B >: A](default: => B): B = this match {
    case None => default
    case Some(a) => a
  }

  def flatMap[B](f: A => Option[B]): Option[B] = map(f) getOrElse None

  def flatMap_1[B](f: A => Option[B]): Option[B] = this match {
    case None => None
    case Some(a) => f(a)
  }

  def orElse[B >: A](ob: => Option[B]): Option[B] = this map (Some(_)) getOrElse ob

  def orElse_1[B >: A](ob: => Option[B]): Option[B] = this match {
    case None => ob
    case _ => this
  }

  def filter(f: A => Boolean): Option[A] = this match {
    case Some(a) if f(a) => this
    case _ => None
  }

  def filter_1(f: A => Boolean): Option[A] = flatMap(a => if (f(a)) Some(a) else None)
}

case class Some[+A](get: A) extends Option[A]

case object None extends Option[Nothing]


object Option {

  def failingFn(i: Int): Int = {
    val y: Int = throw new Exception("fail!")
    try {
      val x = 42 + 5
      x + y
    } catch {
      case e: Exception => 43
    }
  }

  def failingFn2(i: Int): Int = {
    try {
      val x = 42 + 5
      x + ((throw new Exception("fail!")): Int)
    }
    catch {
      case e: Exception => 43
    }
  }

  def mean(xs: Seq[Double]): Option[Double] =
    if (xs.isEmpty) None else Some(xs.sum / xs.length)

  def variance(xs: Seq[Double]): Option[Double] = mean(xs) flatMap (m => mean(xs.map(x => math.pow(x - m, 2))))

  def map2[A, B, C](a: Option[A], b: Option[B])(f: (A, B) => C): Option[C] = a flatMap (aa => b map (bb => f(aa, bb)))

  def sequence[A](a: List[Option[A]]): Option[List[A]] = a match {
    case Nil => Some(Nil)
    case h :: t => h flatMap (hh => sequence(t) map (hh :: _))
  }

  def sequence_1[A](a: List[Option[A]]): Option[List[A]] = a.foldRight[Option[List[A]]](Some(Nil))((x, y) => map2(x, y)(_ :: _))

  def traverse[A, B](a: List[A])(f: A => Option[B]): Option[List[B]] =
    a match {
      case Nil => Some(Nil)
      case h :: t => map2(f(h), traverse(t)(f))(_ :: _)
    }

  def traverse_1[A, B](a: List[A])(f: A => Option[B]): Option[List[B]] = a.foldRight[Option[List[B]]](Some(Nil))((h, t) => map2(f(h), t)(_ :: _))


  def sequenceViaTraverse[A](a: List[Option[A]]): Option[List[A]] =
    traverse(a)(x => x)

  def lift[A, B](f: A  => B): Option[A] => Option[B] = (a: Option[A]) =>  a.map(f)



  def main(args: Array[String]): Unit = {

    val someMap = Some(5) map ((a: Int) => "^" + a.toString + "^")
    println(someMap)

    /*println(Option.failingFn2(2))
    println(Option.failingFn(1))*/

    val f = (a: Int) => math.pow(a, 2) - a + 1
    val liftF = lift(f)
    println(liftF(Some(5)))


    val li = List(Some(1), Some(2), Some(3), Some(4), Some(5))
    val sli = sequence(li)
    println(sli)

    val li2 = List(Some(1), Some(2), Some(3), Some(4), None)
    val sli2 = sequence(li2)

    println(sli2.orElse(Some(Nil)))

    println(sli2.getOrElse(Nil))

    val filterd = Some(5).filter(_ > 5).getOrElse(-1)
    println(filterd)

    val flat = Some(5) flatMap ((a: Int) => Some(a))
    println(flat)
  }


}





上述代码的运行结果是:

Some(^5^)
Some(21.0)
Some(List(1, 2, 3, 4, 5))
Some(List())
List()
-1
Some(5)
















别再乱刷了!《另一个伊甸》异节、改典、典录获取途径完全梳理,这些隐藏奖励你拿全了吗? 本文全面解析《另一个伊甸》中异节、改典、典录的获取途径,包括断章、外传、精灵试炼等高概率掉落副本,以及隐藏任务、限时活动和特殊挑战。提供高效收集策略和优先级建议,帮助玩家快速获取这些稀缺资源,实现角色真证和上限突破。 阅读详情

相关推荐

软件测试——白盒测试实验报告,输入年月日算星期几

软件测试——白盒测试实验报告,输入年月日算星期几,测试用例设计和结果展示

weixin_52278161的博客 2746

scala解析命令行参数详解

这取决于你的命令行解析库和程序的要求。有些库允许在参数前面使用横线,有些则不允许。通常,使用横线是为了明确表示这是一个选项而不是参数值。在常见的命令行规范中,命令行参数通常使用短选项(short options)和长选项(long options)。短选项通常用于单个字符的标识,而长选项则用于更具描述性的标识。总的来说,具体是否需要在参数前面加横线取决于你使用的命令行解析库和程序的设计要求。,则通常期望参数前面有横线。如果你省略了横线,解析库可能无法正确识别参数。是一个短选项,符合通常的命令行风格。

weixin_51981189的博客 1057

MODBUS通讯不求人:手把手教你用三菱FX2N控制士林变频器

本文详细介绍了如何使用三菱FX2N PLC通过MODBUS协议控制士林变频器,涵盖硬件连接、参数配置、程序设计及通讯优化等关键步骤。特别针对没有内置MODBUS函数块的老款PLC,提供了CRC校验和稳定数据交换的实用解决方案,帮助工程师快速实现工业自动化设备的高效通讯。

v4w5x6的博客 226

【scala原理系列】scala option原理示例源码分析

Scala的Option类型是受到Haskell语言中Maybe类型的启发而来。在函数式编程中,处理可能存在或不存在值的情况是一个常见的需求

wang2leee的博客 337

Python量化交易入门:天勤量化TqSdk保姆级教程(含避坑指南)

本文提供Python量化交易入门指南,重点介绍天勤量化TqSdk的使用方法,包括环境配置、核心API实战、策略开发技巧及实盘部署。教程涵盖中国期货市场,帮助个人投资者快速掌握量化交易技术,避开常见陷阱。

weixin_29065791的博客 836

5G NR LDPC码(2)—— 从基图到速率匹配:解码5G高速数据信道的标准化设计

本文深入解析了5G NR LDPC码的标准化设计流程。从作为核心骨架的基图(BG1/BG2)出发,详细阐述了其如何通过扩展因子Z灵活生成实际校验矩阵,并协同传输块大小计算与分段策略。文章重点剖析了基于循环缓存和冗余版本的速率匹配机制,以及其如何高效支撑增量冗余混合自动重传请求,从而确保5G高速数据信道在复杂环境下的可靠与高效传输。

weixin_29206669的博客 273

Scala编程之Option

一、总述        在《Scala编程之样本类与模式匹配》的文章中,鄙人以一个实例介绍了样本类与模式匹配,本篇介绍一个更有趣的东西:Option。        Scala为可选值提供了一个标准类型:Option。这种类型有两个值:Some(x)和None,其中x表示实际值,而None对象代表缺省值。        下面通过编写一个简单的实例实现两种功能:Option类型的两种值;解析...

侠客行 222

ArcGIS基础:城市交通网络构建及设施服务分析(一):道路数据处理与拓扑操作

首先需要加载数据, 1:选择这个数据库:,右键导入,选择导入单个要素,弹出“要素类至要素类” 2:输出位置(导入的数据是CAD格式数据)。 3:输出要素类为道路。 4:字段只保留道路类型字段。 这个操作是分类合并各级道路数据。 1:通过属性选择各类道路数据。 2:比如此类都是“干道”。 3:编辑器下来,然后合并即可。 得到如图所示,需要用到三个字段。 上面这个操作是打断道路相交线。 1:选中所有数据。 2:找到高级编辑中的打断相交线。 3:确定即可。 下面进行拓扑检查,虽然我们已经进行合并和打断相交.

yuanYW7556的博客 2万+

【scala】Option类型详解

scala中的Option操作

weixin_44441131的博客 2917

基于ANSYS的电磁兼容仿真教程

最近,在做某系统的EMC仿真,使用ANSYS套件,对仿真学习做简要记录。本书简介与目录如下:本书配套有:视频教程+工程源文件+彩色仿真图片,下载链接如下:(审核中)第1章 基础知识1.1 电磁兼容基础​​​MS2、EMC三要素:3、 国际无线电干扰特别委员会标准:CISPR标准4、电磁兼容测试认证:传导发射(CE)、传导敏感度(CS)、辐射发射(RE)和辐射敏感度(RS)测试。

weixin_42508010的博客 2059

uniapp - 实现APP后台持续定位+手机息屏后能持续上传位置信息数据,详解后台保活持续运行+手机锁屏保证后台持续/实时定位的解决方案及示例源码(完美兼容安卓android与苹果ios系统手机)

使用uniapp开发app实现后台保活定位能力,uniapp实时定位保活 息屏定位后台运行,uniapp APP实时定位高德 后台运行 支持锁屏息屏运行,持续获取定位信息,uniapp App端后台间隔时间发送定位功能实现,UniApp实现手机应用常活,固定时间内上传手机位置信息,后台(或锁屏)持续/实时定位的实现方案,uni-app后台持续定位,锁屏后能持续上传位置信息,实现后台定位持续无限制定位高德定位,百度定位,UniApp后台持续定位保如何在APP退到后台时保持定位服务,uniapp 切换app仍能

🏆 前端领域优质创作者 1万+

Scala中的选项(Options )

在Java中使用null,偶尔需要处理它。如果未处理,则可能给出NullPointerException。当接受从函数返回的值时可以使用Option,该函数可以在周期时间返回null,否则返回一些值。这两个值之一是“ none”,其他值可以是程序中有效的任何对象。是一个包含一个值的容器,该值可以是两个不同值之一。不会发生此异常,这就是其用法更有效的原因。在Java编程中Option与。当函数失败时,为空类的实例。一个类的实例,当函数成功时。

biqidaoer的专栏 943

反爬虫:对抗最新反爬技术 Cloudflare详解

本文针对Cloudflare最新反爬机制提供完整解决方案,覆盖TLS指纹、行为轨迹、设备指纹等检测场景。文章首先分析Cloudflare的三重检测体系(TLS指纹、行为指纹、设备指纹)及其拦截表现,随后提出四种绕过方案:1)使用curl_cffi模拟浏览器TLS指纹;2)通过undetected-chromedriver移除自动化特征;3)Playwright结合stealth插件模拟人类行为;4)动态请求调度策略。重点推荐轻量级Python方案curl_cffi和浏览器自动化方案Playwright-st

数据知道的博客 4630

scala学习(三)-- 数据结构

数据结构 val 类型指定对象的指针不可变,但指向的对象可变。 1. Scala字符串 String对象不可变,若想创建一个可以修改的字符串,可以使用String Builder类。 2 Scala数组 数组是一种可变的、可索引的、元素具有相同类型的数据集合。 使用圆括号。 可以不给出数组类型。Scala会自动根据提供的初始数值推断出数组类型。 采用Array类型定义的数组属于定长数组,其数组长...

leemusk的博客 271

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Scala 将JSON转换成Map

import net.minidev.json.parser.JSONParser import net.minidev.json.JSONObject import scala.collection.mutable import scala.collection.JavaConversions.mapAsScalaMap import scala.collection.JavaConversio...

E的小小地方 7122

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

用Kleisli组成进行重构

一段时间以来,我们一直在维护一个处理XML和JSON数据的应用程序。 通常,维护包括修复缺陷和添加次要功能,但有时需要重构旧代码。 例如,考虑一个通过路径提取XML节点的函数: import scala.xml.{Node => XmlNode} def getByPath(path: List[String], root: XmlNode): Option[XmlNode]...

324

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

用迭代法进行图像重构_用Kleisli组成进行重构

用迭代法进行图像重构 一段时间以来,我们一直在维护一个处理XML和JSON数据的应用程序。 通常,维护包括修复缺陷和添加次要功能,但有时需要重构旧代码。 例如,考虑一个通过路径提取XML节点的函数: import scala.xml.{Node => XmlNode} def getByPath(path: List[String], root: XmlNode): Optio...

598

Scala语言的数据结构

Scala是一门支持面向对象和函数式编程的现代编程语言,它在JVM上运行,具有强大的类型系统和丰富的标准库。Scala中的数据结构是其编程的重要组成部分,合理使用数据结构可以让代码更加简洁高效。本文将详细介绍Scala中常用的数据结构,包括集合、元组、Option、Either等,并分析它们的使用场景和优势。

2501_90199875的博客 1061

scala中的option、option[T]、Right和Left

前提:当我们设置一个数据库时,一个名字(String)对应一个年龄(Int) 当我输入一个名字的时候来查询这个人的年龄的时候,如果输入一个没有在数据库中的人名,那么该如何返回? 返回0?很明显是不可以的 抛出异常?但是丢失值不可能认定为异常。 java的解决方法: 将方法标记为返回 java.lang.Integer,那么這样就可以放查询的时候返回null值 scala的解决方法--...

感谢你的关注~~~~ღ( ´・ᴗ・` ) 1268

Scala 集合(Array、List、Set、Map、元组、Option)

1、数组 // 创建数组 // **** 方式1 **** val array = Array[String]("a", "b", "c") // **** 方式2 **** // (1) 创建类型为String 长度为3的数组 val array1 = new Array[String](3) // (2) 赋值 array1(0) = "a" array1(1) = "s" array1(2) = "d" 同Java数

TRX的博客 603

scala学习笔记02-scala中的集合类型:Array、List、Map、tuple、Option

scala中Array: Scala提供了一种数据结构叫作数组,数组是一种存储了相同类型元素的固定大小顺序集合。数组用于存储数据集合,但将数组视为相同类型变量的集合通常更为有用。 //数组的声明 var arr01:Array[Int] = new Array[Int](10); var arr02 = new Array[String](10) //遍历 for (x <-...

cfjs790118的博客 500

Scala项目实战:如何将Effective Scala原则应用到实际开发中

Effective Scala是Twitter开发的Scala编程指南,旨在帮助开发者编写更高效、更可读的Scala代码。本文将介绍如何将这些原则应用到实际项目开发中,提升代码质量和开发效率。 ## 一、了解Effective Scala指南 Effective Scala项目以Markdown格式编写,使用PEG markdown和GNU Troff suite (groff)进行排版。项目

gitblog_00576的博客 876

Scala : 数据结构

List列表val nnums = List(1,2,3) //> nnums : List[Int] = List(1, 2, 3)在列表上进行map操作:nnums.map( (i : Int) => i*2) //> res0: List[Int] = List(2, 4, 6)val nnums = List(1,2,3)

Spring , Hadoop, Spark , BI , ML 1740

Scala-7-scala中的常用数据结构

1 Collection集合 Scala提供了一套很好的集合实现,提供了一些集合类型的抽象。 Scala 集合分为可变的集合和不可变的集合。 (1)可变集合可以在适当的地方被更新或扩展,这意味着可以修改,添加,移除一个集合的元素。 (2)不可变集合类,相比之下,永远不会改变。不过,仍然可以模拟添加,移除或更新操作,但这些操作将在每一种情况下都返回一个新的集合,同时使原来的集合不发生改变。 ## 1.1 Scala List(列表) List的特征是其元素以线性方式存储,集合中可以存放重复对象。 Scala

qq_20466211的博客 370

scala either_使用Either和Option处理功能错误

关于本系列 本系列旨在将您的观点重新定位为实用的心态,帮助您以新的方式看待常见问题并找到改善日常编码的方式。 它探讨了函数式编程的概念,允许在Java语言中进行函数式编程的框架,在JVM上运行的函数式编程语言以及语言设计的一些未来方向。 该系列面向那些了解Java及其抽象如何工作,但很少或没有使用功能语言经验的开发人员。 当您调查诸如函数式编程之类的深层主题时,有时会出现迷人的分支...

cusi77914的博客 789

Scala 入门2(数组、List、Set、Map、元组、Option、Iterator)

文章目录 学自 https://www.runoob.com/scala/scala-tutorial.html

Michael是个半路程序员 434
上一篇: 使用Scala实现链表(List)数据结构
下一篇: 使用Scala实现Either数据结构
lhever_
博客等级 码龄14年 213粉丝 130原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值