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代表列数。

相关文章
|
应用服务中间件 nginx Docker
docker中nginx的默认路径位置和映射目录启动
docker中nginx的默认路径位置和映射目录启动
2114 0
docker中nginx的默认路径位置和映射目录启动
|
8天前
|
人工智能 自然语言处理 Shell
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
本教程指导用户在开源AI助手Clawdbot中集成阿里云百炼API,涵盖安装Clawdbot、获取百炼API Key、配置环境变量与模型参数、验证调用等完整流程,支持Qwen3-max thinking (Qwen3-Max-2026-01-23)/Qwen - Plus等主流模型,助力本地化智能自动化。
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
|
6天前
|
人工智能 JavaScript 应用服务中间件
零门槛部署本地AI助手:Windows系统Moltbot(Clawdbot)保姆级教程
Moltbot(原Clawdbot)是一款功能全面的智能体AI助手,不仅能通过聊天互动响应需求,还具备“动手”和“跑腿”能力——“手”可读写本地文件、执行代码、操控命令行,“脚”能联网搜索、访问网页并分析内容,“大脑”则可接入Qwen、OpenAI等云端API,或利用本地GPU运行模型。本教程专为Windows系统用户打造,从环境搭建到问题排查,详细拆解全流程,即使无技术基础也能顺利部署本地AI助理。
6515 13
|
4天前
|
人工智能 机器人 Linux
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI智能体,支持飞书等多平台对接。本教程手把手教你Linux下部署,实现数据私有、系统控制、网页浏览与代码编写,全程保姆级操作,240字内搞定专属AI助手搭建!
3795 11
保姆级 OpenClaw (原 Clawdbot)飞书对接教程 手把手教你搭建 AI 助手
|
4天前
|
存储 人工智能 机器人
OpenClaw是什么?阿里云OpenClaw(原Clawdbot/Moltbot)一键部署官方教程参考
OpenClaw是什么?OpenClaw(原Clawdbot/Moltbot)是一款实用的个人AI助理,能够24小时响应指令并执行任务,如处理文件、查询信息、自动化协同等。阿里云推出的OpenClaw一键部署方案,简化了复杂配置流程,用户无需专业技术储备,即可快速在轻量应用服务器上启用该服务,打造专属AI助理。本文将详细拆解部署全流程、进阶功能配置及常见问题解决方案,确保不改变原意且无营销表述。
4078 5
|
6天前
|
人工智能 JavaScript API
零门槛部署本地 AI 助手:Clawdbot/Meltbot 部署深度保姆级教程
Clawdbot(Moltbot)是一款智能体AI助手,具备“手”(读写文件、执行代码)、“脚”(联网搜索、分析网页)和“脑”(接入Qwen/OpenAI等API或本地GPU模型)。本指南详解Windows下从Node.js环境搭建、一键安装到Token配置的全流程,助你快速部署本地AI助理。(239字)
4210 21
|
12天前
|
人工智能 API 开发者
Claude Code 国内保姆级使用指南:实测 GLM-4.7 与 Claude Opus 4.5 全方案解
Claude Code是Anthropic推出的编程AI代理工具。2026年国内开发者可通过配置`ANTHROPIC_BASE_URL`实现本地化接入:①极速平替——用Qwen Code v0.5.0或GLM-4.7,毫秒响应,适合日常编码;②满血原版——经灵芽API中转调用Claude Opus 4.5,胜任复杂架构与深度推理。
7793 12
|
3天前
|
人工智能 安全 机器人
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
OpenClaw(原Clawdbot)是一款开源本地AI助手,支持钉钉、飞书等多平台接入。本教程手把手指导Linux下部署与钉钉机器人对接,涵盖环境配置、模型选择(如Qwen)、权限设置及调试,助你快速打造私有、安全、高权限的专属AI助理。(239字)
2545 5
OpenClaw(原 Clawdbot)钉钉对接保姆级教程 手把手教你打造自己的 AI 助手
|
4天前
|
人工智能 JavaScript API
零门槛部署本地AI助手:2026年Windows系统OpenClaw(原Clawdbot/Moltbot)保姆级教程
OpenClaw(原Clawdbot/Moltbot)是一款功能全面的智能体AI助手,不仅能通过聊天互动响应需求,还具备“动手”和“跑腿”能力——“手”可读写本地文件、执行代码、操控命令行,“脚”能联网搜索、访问网页并分析内容,“大脑”则可接入Qwen、OpenAI等云端API,或利用本地GPU运行模型。本教程专为Windows系统用户打造,从环境搭建到问题排查,详细拆解全流程,即使无技术基础也能顺利部署本地AI助理。
2997 5