Scala2.8尝鲜:使用Numeric让基本类型范型化

处理基本类型是Java中最烦人的一个地方了,很多时候我们必须为每一种基本类型各写一份大同小异的代码。这造成了严重的代码冗余,对代码的维护也带来负担。虽然在Java5中引入了范型,但对基本类型的操作并没有带来任何便利。考虑一个简单的例子:
设计一个方法sum,用于计算两个数的和,并且返回值的类型与参数类型一致。
在Java中,我们只能通过重载sum方法,为每一种基本类型写一个sum方法:
    public  int sum(int a,int b){ return a+b}
public long sum(long a,long b){return a+b}
public float sum(float a,float b){return a+b}
public double sum(double a,double b){return a+b}
...

显然比较理想的方式应该是我们用一个类似于

T sum(T a,T b){ return a+b }

的方法一劳永逸的适用于所有的问题。
在Scala2.8中,新增了一个trait Numeric以及与之相关的类,使用这个类我们就可以得到类似的效果:

Welcome to Scala version 2.8.0.r18591-b20090828020156 (Java HotSpot(TM) Client VM, Java 1.6.0_14).
Type in expressions to have them evaluated.
Type :help for more information.

scala> def sum[T](a :T,b :T)(implicit m:Numeric[T]) :T ={
| import m._
| a + b
| }
sum: [T](a: T,b: T)(implicit m: Numeric[T])T

scala> sum(1,2)
res0: Int = 3

scala> sum(1.0,2.0)
res1: Double = 3.0

注意方法sum的参数中包含一个[url=http://www.scala-lang.org/node/114]隐式参数[/url]implicit m:Numeric[T],这个参数在调用的时候无需显式指定,编译器会自动找到相应的值做参数。
类似的,我们可以定义一个通用的max方法:

scala> def max[T](a :T,b :T)(implicit m:Numeric[T]) :T = {
| import m._
| if(a >= b) a else b
| }
max: [T](a: T,b: T)(implicit m: Numeric[T])T

scala> max(1,2)
res2: Int = 2

scala> max(1.0,2.0)
res3: Double = 2.0

scala>


而且这个Numeric只是往以前的核心库中添加了一组API,并没有使用任何Scala2.8中新的语法;在Scala2.7.x中就能实现它。
SpringBoot+Vue+kkFileView实现文档管理(文档上传、下载、在线预览) 上面在使用OpenOffice实现doc、excel、ppt等文档的管理和预览。除此之外可用kkFileView实现包括且更多文档的预览。 阅读详情

相关推荐

电路板功能测试系统-FCT for PCBA

电路板功能测试系统用于电路板组件(PCBA)的功能测试(FCT),满足自动化大批量生产的要求。  ● 用户根据自己需要定义测试步骤,灵活方便  ● 适合工业自动化大批量生产应用  ● 系统测试精度高,稳定可靠   一、电路板功能测试系统概述 电路板测试过程通常由多个步骤组成,每单个步骤中需要对多个物理量(电压、电流、电阻、频率、波形等)进行测试。在每个步骤测试时

6814

scala - implicit

概述 在scala中的implicit意味着可以将一种数据类型自动转换为另一种数据类型,或者在方法调用时某些参数可以自动传递给方法。 隐式类型转换(implicit conversion) 隐式类型转换简单的说,如果在类C的对象o上调用方法m,并且该类不支持方法m,那么Scala将寻找从C到支持m的隐式转换。 String类型的隐式转换 scala.Predef定义了String类型的2...

lzf的博客 676

Adobe Acrobat Pro(Adobe PDF) - 使用技巧

Adobe Acrobat Pro为Adobe出品的PDF查看和编辑软件,下文简称Adobe PDF,该软件功能强大,拥有查看PDF、编辑PDF、打印PDF、导出PDF、合并文件、组织页面、文本标注、注释、动作向导、等功能。本文介绍Adobe PDF的一些使用技巧,最后介绍软件设置。

NSJim的博客 4万+

Scala基础语法之变量+Scala数据类型

目录 变量 Scala类型体系 数值类型(Numeric types): Boolean类型: Char类型: Unit: Null: Nothing: String 变量 三种变量修饰符: val 定义immutable variable 常量; var 定义mutable variable 变量; lazy val 定义惰性求值的常量; sca...

小宫主的博客 711

ROS2实战:打造智能巡检机器人的关键技术与实现

本文详细介绍了基于ROS2和Navigation2构建智能巡检机器人的完整实战流程。通过设计主从协作的事件驱动架构,实现了机器人在已知地图中的自动导航、定点语音播报和环境图像采集功能。文章涵盖了从环境搭建、仿真配置到核心控制节点、语音服务与图像记录模块的代码实现,为开发者打造实用的自动巡检机器人提供了清晰的技术指南。

weixin_29031057的博客 226

SAR动目标检测三剑客:DPCA/ATI/STAP技术选型指南(含2023最新实验数据对比)

本文深入对比了SAR动目标检测三大主流技术DPCA、ATI与STAP的核心原理与性能差异。基于2023年最新实验数据,分析了它们在最小可检测速度、测速精度、计算复杂度及对通道失配敏感度等方面的优劣,并结合海洋监视与城市交通监控等典型场景,提供了具体的技术选型指南与工程落地考量。

m5n6o7的博客 295

scala数据类型_Scala中的数字类型

scala数据类型 Scala数值类型 (Scala Numeric Types) Numeric type in Scala deals with all types that are stored in numerical. The data type that is used is decimals (float and Double) and integers (Int, Short, L...

916

【电磁场计算】磁偶极子在外磁场中的受力

最近在总结电磁场计算公式的时候发现,关于磁偶极子受力的计算公式,在不同文献中的说明有点出入,在此特地写一篇博客澄清一下。

sky4403的博客 7476

scala实现数值类型加法

在前面的文章里,我们讲了在java中如何利用泛型实现数值类型加法。具体可以参考博文http://blog.csdn.net/bitcarmanlee/article/details/78733637。 那么在scala中,我们怎么实现上面的需求呢?1.用 <: 模拟extends关键字行不通如果按照在java中的处理思路,我们可以这么尝试一下: def numberAdd[T <: Numb

bitcarmanlee的博客 5116

【WILEY】从Revision到Online:一次投稿的完整状态演进与关键节点实战解析

本文详细解析了从Revision到Online发表的完整投稿流程,包括修改稿准备、回复信撰写、状态跟踪等关键节点。特别针对Wiley期刊,提供了实用的操作技巧和常见问题解决方案,帮助作者高效完成论文修改与发表。

weixin_29219189的博客 362

AI 编程工具面试题(Claude Code、Codex 等)基础篇(一)

文章摘要: 本文整理了20道AI编程工具基础面试题,涵盖Claude Code、Codex CLI、GitHub Copilot等主流工具的核心概念与实操技巧。内容分为工具分类(代码补全/对话式/自主代理)、安装配置(静默部署/API管理)、关键命令(上下文加载/token监控)、调试策略(错误处理/提示优化)及对比选型(Tabnine vs Copilot)。重点解析了终端工具与模型能力的差异,并针对实际场景(如长代码生成/私有化部署)提供解决方案。附追问环节,深入探讨工具边界问题(如上下文溢出处理)和成

篮球界最会写bug的人;程序猿中打球最菜的人。 339

Scala:数据结构

Scala:数据结构Scala 类型体系Scala 数据类型详解1.Numeric types:byte/short/int/long/float/double2.Boolean:true/false3.Char4.Unit5.Null6.Nothing7.String Scala 类型体系 1.scala的根类是Any, Any是scala所有类的父类, Any下面有两个子类:AnyVal、...

Suzy_Leili的博客 791

C#与天文观测:Celestia模拟星空的奇幻之旅

Celestia就像一艘穿梭在星海中的小飞船,带领我们遨游宇宙。C#则是这艘飞船的智能导航系统,用代码指挥它飞向任何我们向往的星球或星系。首先,下载并安装Celestia,熟悉其基本操作和功能。创建一个星空目标列表,包括不同的恒星、行星和星系。// 示例:定义观察目标列表new SpaceObject("太阳"),new SpaceObject("月球"),new SpaceObject("火星")

java专栏 1457

Scala 语言规范 Changelog 全解读:从 2.0 到 2.8.0 的语言演进史与关键特性溯源

> **导读**:本文以 Scala 官方语言规范第 15 章([spec/15-changelog.md](https://link.gitcode.com/i/ae2174cdbce4265a6269b32352b93230))为骨架,系统梳理 Scala 2.0 至 2.8.0 期间所有重要的语言变更——从存在类型、lazy 值、提取器(extractor)到弱一致性(weak confor

gitblog_00649的博客 213

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

Scala School 笔记(五)--高级类型

--------------待续

Jack‘s bolg 4372

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【scala类型系统】type classes模式及依赖类型

type classes模式及依赖类型

檐前潜心学种瓜 554

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

java Scala数据类型转换,Scala转换为泛型类型(用于通用数值函数)

I'm trying to implement a generic function that wraps a mathematical Java function. For simplicity, we can assume that the Java function (Java 7) takes one parameter and returns a result, both of type...

weixin_42360285的博客 414

Scala 标准库规范深度解析:类型层级、值类、数组与 Predef 机制全解

本文以 Scala 语言规范第 12 章([spec/12-the-scala-standard-library.md](https://link.gitcode.com/i/a244bf305bac2fbbae60d070fab2f754))为骨架,系统讲解 Scala 标准库(`package scala`)的核心构成:从 `Any`/`AnyRef`/`AnyVal` 三大根类的语义约定,到

gitblog_00655的博客 319

Scala 高级类型

高级类型«PreviousNext»课程内容:视界 (“类型类”)其他类型限制更高级多态性类型 和 特设多态性F-界多态性 / 递归类型结构类型抽象类型成员类型擦除和清单案例分析: Finagle视界(“类型类”)有时候,你并不需要指定一个类型是等/子/超于另一个类,你可以通过转换这个类来伪装这种关联关系。一个视界指定一个类型可以被“看作是”另一个类型。这对对象的只读操作是很有用的。*隐式*函数允...

bbbeoy的专栏 504

Scala 3 类型类实战指南:从 given/using 到 Monoid,一次看懂最核心的抽象编程技巧

类型类(Type Class)是 Scala 3 中最具代表性的抽象编程思想,而 `given`/`using` 语法则是它的“翻译官”。本文以 O'Reilly 经典图书《Programming Scala(第3版)》官方代码仓库 programming-scala-book-code-examples 为素材,用新手也能看懂的方式,精讲 Scala 3 类型类实战:如何用 `given`/`u

gitblog_01007的博客 225

PG库数据numeric格式数据读到内存中格式

numeric 在内存中格式

qq_43341418的博客 43

浅谈Scala 2.8的包对象(package object)

Scala 2.8提供包对象(package object)的新特性。什么是包对象呢?按我的理解,根据Scala“一切皆对象”设计哲学,包(package)也是一种对象。既然是对象,那么就应该有属性和方法,也可以在包对象内声明某个类型的别名。举个例 package com { package object ggd543 { type HashMap[A, B] = scala.c

YiqiangXu的博客 249

Scala工程师进阶指南:类型系统、不可变性与生产避坑

Scala 不是语法糖堆砌的 Java 替代品,而是一套以类型系统为基石的工程化编程范式。其核心在于将业务约束(如‘可能为空’‘状态有限’‘计算未完成’)直接编码进类型签名,使错误前移至编译期。结合不可变集合、模式匹配与 sealed trait,可构建高可维护性分布式系统;借助隐式参数与类型类,实现零运行时开销的依赖抽象与行为扩展。在 Spark、Akka、Cats 等主流生态中,这些特性共同支撑着数据流水线稳定性、微服务状态一致性与函数式错误传播能力——本文聚焦真实生产场景中的五大关键断层,直击类型推导

weixin_33866037的博客 373

Scala class RichInt入门

final class RichInt(val self : scala.Int) extends scala.AnyVal with scala.runtime.ScalaNumberProxy[scala.Int] with scala.runtime.RangedProxy[scala.Int] { protected def num : scala.math.Numeric.IntIsIntegral.type = { /* compiled code */ } protected def

鸭梨的博客 353

idea+scala 安装流程 64位 附安装包和案例

安装所需的程序和包 链接:https://pan.baidu.com/s/17i9zZoLJryxTftcBMlCa-A 提取码:xl9m 1、安装idea 一直点下一步就可以了 2、安装jdk 1.8 64位 一直安装不断下一步 我的安装位置为C:\Program Files\Java\jdk1.8.0_181 3、scala安装+配置环境变量 双击...

m0_37541971的博客 873

scala 下 sigmoid 与breeze.numeric.sigmoid差异对比

scala> val beforeInit = System.nanoTime;val handsgn = rd.map(x => 1.0 / (1.0 + Math.exp(-x)));val cost = System.nanoTime - beforeInit; beforeInit: Long = 35022621366051878 handsgn: scala.col...

weixin_30633405的博客 232
上一篇: Scala2.8尝鲜:命名参数与默认参数
下一篇: Sun在Devoxx2009上宣布Java7中将加入FCM(闭包)
JavaSxy
博客等级 码龄21年 1粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值