F#数组常见用法

简介: F#数组是固定大小的、从0开始、可变的连续数据元素集合,这些元素属于同一类型。一般来说,数组以一维数组和二维数组比较常用。在F#中还有一种列表类型(也是同类型的元素),它和数组的定义比较类似,但是它是不可变的对象,即一旦列表定义好后,我们无法修改特定索引上的元素值,而只能读取。但F#数组却可以进行元素的读取和写入。

    根据官方定义,F#数组是固定大小的、从0开始、可变的连续数据元素集合,这些元素属于同一类型。一般来说,数组以一维数组和二维数组比较常用。在F#中还有一种列表类型(也是同类型的元素),它和数组的定义比较类似,但是它是不可变的对象,即一旦列表定义好后,我们无法修改特定索引上的元素值,而只能读取。但F#数组却可以进行元素的读取和写入。

//列表leta= [1;2;3]
//不可变a.[0] <-1//error/////////////////////////////数组 int[]leta= [|1;2;3|]
//可变a.[0] <-1

    下面给出一维数组和二维数组的常用用法示例:

moduleArrayDemolettest() =//[|1; 2; 3|]letarr= [|1; 2; 3|]
printfn"%A"arrletarr= [|foriin1 .. 10->2*i|]
//length=10printfn"length=%d"arr.Length//[|2; 4; 6; 8; 10; 12; 14; 16; 18; 20|]printfn"%A"arr//2printfn"%d"arr.[0]
//[|2; 4; 6|]printfn"%A"arr.[0..2]
//[|2; 4; 6|]printfn"%A"arr.[..2]
//[|6; 8; 10; 12; 14; 16; 18; 20|]printfn"%A"arr.[2..]
//修改值arr.[0] <-0//[|0; 4; 6|]printfn"%A"arr.[0..2]
letarr=Array.create70.0//[|0.0; 0.0; 0.0; 0.0; 0.0; 0.0; 0.0|]printfn"%A"arrletarr2=Array.subarr02//[|0.0; 0.0|]printfn"%A"arr2letarr2=Array.append [|1; 2; 3|] [|4; 5|]
printfn"%A"arr2letarr2=Array.choose(fune->ife%2=0thenSome(e)
elseNone) arr2//[|2; 4|]printfn"%A"arr2letarr2=Array.collect (fune-> [|2*e+1|] ) arr2//[|5; 9|]printfn"%A"arr2letarr2=Array.concat [ [|0..3|] ; arr2 ]
//[|0; 1; 2; 3; 5; 9|]printfn"%A"arr2letarr2=Array.filter (fune->e%2=1) arr2//[|1; 3; 5; 9|]printfn"%A"arr2letarr2=Array.revarr2//[|9; 5; 3; 1|]printfn"%A"arr2letamap=Array.map2 (fune1e2->e1*e2 ) [|1;2;3|] [|1;2;3|]
//[|1; 4; 9|]printfn"%A"amaplets=Array.sumamap//14printfn"%d"slettarr=Array.chunkBySize2 [|1;2;3;4;5;6|]
//[|[|1; 2|]; [|3; 4|]; [|5; 6|]|]printfn"%A"tarr////////////////////////////letarr2d=array2D  [ [ 1; 0]; [0; 1] ]
        (* [[1; 0]
        [0; 1]] *)
printfn"%A"arr2dletarr2d=Array2D.init32 (funij->0)
        (* [[0; 0]
        [0; 0]
        [0; 0]] *)
printfn"%A"arr2dletarr2d=array2D  [ [1;2;3]; [4;5;6] ]
//[[4; 5; 6]]printfn"%A"arr2d.[1.. , * ]
        (*[[2; 3]
        [5; 6]]*)
printfn"%A"arr2d.[* , 1..2 ]
//[|2; 5|]printfn"%A"arr2d.[* , 1]
//1,2,3Array.iter (fune->printf"%d,"e) [|1;2;3|]
//Array.iter (fun e -> printf "%A" e) arr2d //Error//2printfn"%d" (Array2D.length1arr2d)
//3printfn"%d" (Array2D.length2arr2d)
//1,2,3,4,5,6,Array2D.iter (fune->printf"%d,"e) arr2dprintfn""        (*[0,0]=1        [0,1]=2        [0,2]=3        [1,0]=4        [1,1]=5        [1,2]=6*)
Array2D.iteri (funije->printfn"[%d,%d]= %d"ije) arr2d//二维数组letm1=array2D  [ [1;2;3]; [4;5;6] ] 
letm2=array2D  [ [7;8;9]; [10;11;12] ] 
letrlen=Array2D.length1m1letclen=Array2D.length2m1letm3=Array2D.initrlenclen (funij->0)
fori=0torlen-1doforj=0toclen-1dom3.[i,j] <-m1.[i,j] +m2.[i,j]
        (*        [[8; 10; 12]
        [14; 16; 18]]
*)
printfn"%A"m3

     其中的 printfn "%A" arr 可以打印出数组arr的内容。%A即代表数组类型。arr.Length 可以获取一维数组元素的长度。数组的元素可以通过 .[index]来获取,注意前面有一个dot符号,即arr.[0] 可以获取到一维数组arr的第一个元素(下标为0)。另外,还可以给定范围,获取多个元素,即arr.[0..2] 可以获取3个元素,即下标为0,1,2的元素。此外,通过类似 获取元素的用法,还可以省略开始下标或者结束下标,如arr.[..2]

    数组的创建还可以通过Array.create方法来实现,如let arr = Array.create 7 0.0则创建一个长度为7,初始值为0.0的一维数组,即[|0.0; 0.0; 0.0; 0.0; 0.0; 0.0; 0.0|]。Array.append [| 1; 2; 3|] [| 4; 5|] 方法可以将两个数组进行合并,值为[| 1; 2; 3; 4; 5|] 。Array.concat方法可以将一个二维数组转换成一个一维数组,即Array.concat [ [|0..3|] ; [|5; 9|] ] 生成[|0; 1; 2; 3; 5; 9|] 。

    而Array.map2 (fun e1 e2 ->  e1*e2 ) [| 1;2;3 |] [| 1;2;3 |] 中的Array.map2可以将两个长度一致的一维数组进行映射,并生成新的数组,返回[|1; 4; 9|]。Array.sum 方法则可以将一维数组中的元素进行求和操作。Array.chunkBySize 2 [| 1;2;3;4;5;6 |]则将一维数组按照2个一组进行拆分,即生成[|[|1; 2|]; [|3; 4|]; [|5; 6|]|] 。

    对于二维数组,则可以通过array2D进行定义,如 let arr2d = array2D  [ [ 1; 0]; [0; 1] ] 或者通过Array2D.init方法进行初始化,如Array2D.init 3 2 (fun i j -> 0)。对于一个arr2d值为[ [1;2;3]; [4;5;6] ] 的二维数组,arr2d.[1.. , * ] 可以获取到[[4; 5; 6]] 。而下面的示例就可以实现二维数组的和,比如矩阵求和,类似于矩阵求和:

letm1=array2D  [ [1;2;3]; [4;5;6] ] 
letm2=array2D  [ [7;8;9]; [10;11;12] ] 
letrlen=Array2D.length1m1letclen=Array2D.length2m1letm3=Array2D.initrlenclen (funij->0)
fori=0torlen-1doforj=0toclen-1dom3.[i,j] <-m1.[i,j] +m2.[i,j]
(*   [[8; 10; 12]
   [14; 16; 18]]
*)
printfn"%A"m3

这里注意,二维数组有两个长度属性,即Array2D.length1代表行数,而Array2D.length2代表列数。

相关文章
|
Ubuntu 数据安全/隐私保护
百度搜索:蓝易云【ubuntu安装qemu教程】
现在,你已经成功在Ubuntu系统中安装了QEMU。你可以使用QEMU来模拟x86、ARM等体系结构的虚拟机,并在其中运行不同的操作系统。请注意,QEMU的使用可能涉及到一些复杂的参数和配置,具体使用方法可以参考官方文档或相关教程。
543 1
|
Kubernetes Cloud Native jenkins
|
24天前
|
人工智能 弹性计算 自然语言处理
OpenClaw部署难?不要慌!阿里云秒级部署,两步拥有专属AI助理!
开源AI智能体OpenClaw(原Clawdbot)能一句话完成文件处理、日程管理、跨平台协同与代码辅助,但本地部署门槛高:依赖复杂、需64GB内存、报错难解、安全风险大。阿里云推出一键部署方案,2步即可在轻量服务器上快速启用,支持钉钉/飞书/企微等,秒变高效“数字员工”。
174 18
|
11天前
|
人工智能 Linux API
阿里云轻量服务器分钟级部署OpenClaw保姆级教程(含本地搭建+千问/Coding Plan配置)
OpenClaw(曾用名Clawdbot)是一款轻量化、可扩展的AI助手框架,支持多模型接入、多渠道交互与本地/云端混合部署,能快速搭建个人或团队专属AI服务。2026年,阿里云轻量服务器提供OpenClaw官方预装镜像,实现分钟级一键部署,大幅降低新手入门门槛。本文基于最新实践,提供阿里云轻量服务器零代码部署、本地MacOS/Linux/Windows11全平台搭建、阿里云千问大模型与免费Coding Plan API配置的完整流程,同时整理高频问题与避坑方案,全程无复杂操作,新手可直接按步骤完成部署。
370 0
|
3月前
|
人工智能 开发框架 安全
LLM驱使智能体:从概念、原理到落地实践的完整技术科普指南
随着大语言模型发展,AI正从被动响应迈向主动执行。LLM驱使智能体以大模型为核心决策引擎,通过“推理—行动—反馈”闭环,实现目标导向的自主任务执行,具备动态决策、持续运行与复杂环境适应能力。其在办公自动化、软件开发、知识工作等场景广泛应用,正成为连接大模型能力与现实任务的关键桥梁,推动智能系统向更高阶形态演进。
280 5
|
4月前
|
人工智能 自然语言处理 索引
2026企业战略升级:为何必须掌握Geo优化两大核心与四轮驱动
2026年,生成式AI重塑营销格局,企业竞争聚焦“信任”与“效率”。Geo专家于磊老师首创“两大核心+四轮驱动”优化体系,以人性化内容与交叉验证破解品牌失语、获客低效、舆情固化难题,助力企业在AI时代构建可信、高效的内容护城河,实现可持续增长。
178 5
|
Java Linux Maven
Docker系列教程11-使用Nexus管理Docker镜像
原文: Nexus简介 Nexus是一个多功能的仓库管理器,是企业常用的私有仓库服务器软件。目前常被用来作为Maven私服、Docker私服。本文基于Nexus 3.5.2-01 版本进行讲解。
4326 0
|
6月前
|
缓存 自然语言处理 PyTorch
114_预训练:Masked LM优化与动态掩码效率深度解析
在大型语言模型(LLM)的预训练阶段,训练目标函数的设计直接影响模型的学习效率和最终性能。Masked Language Modeling(MLM)作为BERT等模型采用的核心预训练任务,通过随机掩盖文本中的部分token并让模型预测这些被掩盖的token,有效地训练了模型的双向表示能力。然而,传统的静态掩码策略存在重复率高、训练效率低等问题。动态掩码技术的引入显著提升了预训练效率和模型性能。本文将全面探讨MLM优化策略,深入推导动态掩码的效率提升原理,并介绍2025年最新的MLM优化技术,为高效预训练LLM提供理论和实践指导。
683 0
|
7月前
|
存储 缓存 安全
Python字典:从入门到精通的实用指南
Python字典如瑞士军刀般强大,以键值对实现高效数据存储与查找,广泛应用于配置管理、缓存、统计等场景。本文详解字典基础、进阶技巧、实战应用与常见陷阱,助你掌握这一核心数据结构,写出更高效、优雅的Python代码。
187 0
|
10月前
拼多多商家私信群发工具,卖家私信批量发送脚本,按键内部定制版工具
这是一款针对拼多多商家私信自动化工具的源码,旨在帮助客服外包公司与拼多多商家联系合作。功能包括全自动后台打招呼、随机话术发送等。

热门文章

最新文章