地道的F# - 函数式 vs. 命令式

符号音乐生成:深度解析MIDI与MusicXML的结构化建模方法 符号音乐生成是人工智能在音乐创作领域的重要技术路径,区别于端到端音频合成,它聚焦于音高、时值、调性、声部关系等抽象结构信息的建模与生成。其核心原理在于将乐谱转化为可学习的离散token序列,并嵌入音乐语义约束(如和声功能、对位规则),从而保障生成结果具备可编辑性、理论合规性与创作实用性。该技术显著提升作曲工作流效率,支撑AI辅助和声教学、MIDI实时编排、风格化变奏生成等场景。本文深入探讨基于MusicXML数据清洗、分层token设计、双轨调性编码及节奏一致性损失等关键实践,为计算机专业学生、音乐技术开发 阅读详情

我们的故事要从这个叫Stuart Bowers的家伙开始,下图中,他正拿着一个来自Café Press网站的杯子喝着咖啡,此杯子正是他对函数式编程做出出色贡献的象征。

 

 IMAGE_154

Stuart是Amalga(一个微软推出的医疗系统)项目的一个开发者,也是微软公司的一位全职员工。此人不写博客——此乃世界的一大损失也…

 

不管怎样,他还是帮我审读过我写的书中的几个章节,并且最近我们还有一次促膝长谈,讨论并分享怎样才是一个地道的F#风格的话题。

 

问题

 

提问:在编写下面的代码时,怎样才是“正确的F#方式”:

创建一个共享的,可变得值并且生成聊个线程池用来累加一个List(F#中的链表)中的元素。(故意创建一个竞争的环境,此乃这个代码示例的关键所在。)

 

命令式(?)方法

让我们以如何使用命令式方式来回答此问题作为开始。

命令式的代码非常的直观且提供如下一些好处:

  • 简单。只需要两个调用QueueUserWorkItem的线程和一些布尔标量来跟踪是否线程完成了,而不是整个正在运行的线程。

然而,这也有一些弊端:

  • 冗余。两个传入QueueUserWorkItem的表达式本质上是一样的,因此,此代码是重复的。如果你想调整他们,例如添加日志,那么你或者会忘记在两个地方都更新代码,或者会仅仅添加代码两次。
  • 数据隐藏。这两个线程最大的区别在于他们累加的数组元素的下标范围。第一个数组从0计算到len/2– 1,第二个线程从len/2到len。然而,关键的因素被隐藏在代码中两个不同的位置。

 

函数式(?)方法

现在让我们来看看如何用更函数式的风格实现它。

让我们先来看看这个函数式风格的弊端:

  • 太多的变量值。在这个函数里有7个变量值绑定——想必它们都是必要的。
  • 概念数。这个更函数式的实现当然要求你要理解一些F#编码原则。(虽然把线程代码匹配到一个QueueUserWorkItem是相当流行的)

虽然可以说是混淆,但函数式风格提供了一些明显的好处:

  • 重要的数据可以被抽出,而不是硬编码"0 to len /      2"和"len / 2"这些值,计算数组元素的总数的边界被明确地抽出放在连续的代码行上。这使得声明离一误差(OBOE详见维基百科)更容易地被找到和修复。
  • 代码重用,而不是硬编码这两个线程池函数,一个需要明确边界的sumFlements函数被引入来求和。

就我而言,我部分地支持第一个例子的简单,但是第二个例子在调用范围值的价值不应该被忽视。我最喜欢F#的一个地方是它是多范式的语言,即通常情况下有一个以上的方法来解决问题,这意味着你有多个选择。

 

原文链接:http://blogs.msdn.com/b/chrsmith/archive/2009/04/23/idiomatic-f-functional-vs-imperative.aspx

深入探索F#编程语言 本文还有配套的精品资源,点击获取 简介:《DeepDives:F# 深潜》是一份针对F#编程语言的深入学习资源,详细介绍了F#的核心概念、高级特性和实际应用。它涉及F#的强类型系统、函数式编程、自定义数据类型、面向对象编程、序列操作、异步工作流等关键特性,并通过实例展示了F#在数据处理、Web开发和机器学习等领域的应用。读者将通过源代码和示例项目实践F#编程,从而提高在项目... 阅读详情

相关推荐

Disk Drill 使用教程

Disk Drill只需单击几下,即可恢复USB闪存驱动器上已删除的数据,包括丢失的照片,文档和其他文件类型。Disk Drill是真正的多合一应用程序,可在Mac上恢复闪存驱动器。Disk Drill将自动应用最佳的笔式驱动器恢复算法来恢复Mac数据。 USB闪存驱动器是一种传输和存储信息的好方法,但是如果错误地丢失或删除了存储在其中的文件,会发生什么呢?当您需要Mac的闪存驱动器数据恢复软件时,Disk Drill是您的最佳选择。Disk Drill将扫描您的USB闪存驱动器(也称为笔式驱动器)并查找

zjj778899的博客 1万+

F#实战入门:23行代码搞定CSV订单分析

F#是一种运行在.NET平台上的实用函数式编程语言,以不可变数据、管道操作符和模式匹配为核心特性,天然适合数据处理任务。其类型推导能力强大,记录类型(Record)让领域建模直观简洁,与C#、Python等语言相比,在解析CSV、清洗日志、聚合API响应等场景中能显著减少胶水代码和运行时错误。本文基于真实订单分析案例,展示如何用声明式数据流替代嵌套循环与临时变量,突出F#在ETL脚本、报表生成、配置校验等低副作用模块中的工程优势,并强调其与.NET生态的无缝互操作性。

a6t2007的博客 496

泛微ecology9 利用字段值动态控制明细表显示与隐藏

本文详细介绍了在泛微ecology9中,如何利用WfForm.bindFieldChangeEvent监听字段变化,结合jQuery动态控制明细表显示与隐藏的实战方法。通过五步操作,可实现根据字段值(如报销类型)智能切换明细表,提升表单交互体验与开发效率,并确保PC与移动端完美兼容。

7z8x2c4v6b9的博客 585

编程语言难度评估:从多维度拆解到个人学习路径规划

编程语言作为软件开发的基石,其学习难度一直是开发者关注的核心议题。从技术原理上看,语言难度并非单一指标,而是由语法入门门槛、心智模型转换、生态工具链成熟度及目标问题域复杂度等多个维度共同构成。在工程实践中,理解这些维度有助于开发者进行更精准的技术选型与学习规划。例如,Python以其低语法门槛和丰富生态,在快速原型开发中体现高使用价值;而Rust的所有权系统和编译期安全检查,虽然提升了初期学习曲线,却在系统编程领域提供了不可替代的安全保障。本文通过建立个人化的“难度-收益”评估框架,结合具体的热门语言如Ru

weixin_34161083的博客 368

(超详细)互补格雷码+相移码求解包裹相位(Python实现)

记录实现“互补格雷码+相移码”求解包裹相位的编码过程。也可以叫它“5+4”法,5代表五幅格雷码图像,4代表四步相移法的四张正弦条纹图。

暴雨梨花博客 3万+

stm32f103c8t6+esp8266在WiFi下通过手机控制外设

stm32f103c8t6+esp8266在WiFi下通过手机控制外设前言 前言 通过上一篇,介绍了esp8266的基本功能,这篇将用stm32c8t6配合esp8266进行数据交互,实现用手机通过无线的方式去控制外设、开关等;这里相当于把stm32作为上一篇的串口助手和esp8266进行通信; ...

weixin_45430735的博客 1万+

F#语言入门之什么是F#语言

F#是一种函数式编程语言,可以轻松编写正确且可维护的代码。 F#编程主要涉及定义类型推断和自动泛化的类型和函数。 这使您可以将焦点保留在问题域上并操纵其数据,而不是编程的细节。 open System // Gets access to functionality in System namespace. // Defines a function that takes a name an...

u012525929的博客 9840

微信小程序 - 最新详细实现跳转打开第三方网站方法流程及示例代码,在小程序内直接打开H5页面或微信公众号文章后台业务域名配置及下载校验文件上传服务器,嵌入外部网站跳转第三方h5网页(详细配置及代码)

微信小程序,打开第三方网站,放校验文件,怎么配置业务域名,后台配置,怎么打开外部没有关联的网站,小程序直接打开公众号文章,指定页面,跳转第三方url,跳转到外部网站,小程序跳转到任意外部网页,网站链接,跳转到其他网页(外部链接),小程序嵌入外部h5链接,校验文件怎么放到对方服务器上,要跳转到网站没权限放过去,校验文件验证域名,把校验文件放到对面网站,别人的服务器也打不开没权限怎么放呢,勾选不校验合法域名,txt,打不开别人的网页怎么办,真机调试打不开,无法跳转,有什么其他办法不放校验文件吗,别人不可能同意,

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

【F#初学者】第一讲 F#简介&&&第一个F#程序

F#初学者系列,介绍了F#的优势和编写了第一个程序

scixing的博客 1128

全新RT-DETR 有效涨点改进目录 | 包含各种卷积、主干改进、各种注意力机制、Neck特征融合改进、损失函数、AIFI创新改进、独家创新、小目标检测、特殊场景检测等最全大论文及小论文必备创新改进点

《全新最全RT-DETR涨点改进专栏》提供500+种创新改进方案,涵盖卷积、注意力机制、主干网络等模块优化,适用于PCB检测、工业缺陷检测等场景。专栏包含顶会论文改进点、数据集增强方法、热力图可视化等实用功能,帮助科研人员快速提升模型性能。提供完整环境配置指南(Python3.10+Pytorch2.5.1)和训练教程,支持不同版本RT-DETR模型。定期更新涨点策略,配套QQ答疑群免费指导,适合从入门到发论文全流程需求,特别推荐给目标检测领域的研究生和工程师。

Ai缝合怪、助力小伙伴高效发论文 3416

团体程序设计天梯赛竞赛题--登顶题【L3-039 攀岩】

登顶级 3 道题,每道题 30 分,满分为 90 分。

Pretty Boy Fox的博客 653

F#语言

翻译得不错,摘录: F#并行与异步编程 2009-11-30 15:23   F#的程序经理Luke Hoban发表了一场名为“F#并行与异步编程”的演讲,其中提出了并行与异步编程的多个重点与挑战,并解释了F#是如何从语言特性及类库框架两方面来给出合适应对方案。F#是.NET平台上的又一门编程语言,结合了函数式编程及面向对象编程两种编程范式。微软研究院在5至6年开始着手设计并开发F#...

X-Info,opening-platform 348

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

函数式编程和命令式编程

这一特性促使函数式编程倾向于避免使用状态(state)和可变变量(mutable variables),转而采用高阶函数(能够接受函数作为参数或返回函数的函数)以及纯函数(在给定相同输入条件下,始终产生相同输出的函数)作为构建程序的基本构件。函数式编程(Functional Programming, FP)与命令式编程(Imperative Programming, IP)是编程领域中两大截然不同的范式,它们在解决问题的策略和哲学上存在着本质的差异。

skywalk8163的专栏 784

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

F# 4.0 设计模式(一)

遵循设计模式是编写更好程序的一种众所周知的方法,它捕获并重用了许多应用程序中常见的许多高级抽象。本书将鼓励你通过完全拥抱函数优先的 F# 范式来发展一种地道的 F# 编码技能集。它还将帮助你利用这个强大的工具来编写简洁、无错误和跨平台的代码。《F# 4.0 设计模式》将从帮助你培养一种函数式思维方式开始。我们将向你展示函数优先范式的好处以及如何使用它来获得最佳结果。本书将帮助你掌握主要函数式设计模式的知识,这些模式与传统“四人帮”模式之间的关系并不直接。

龙哥盟 441

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

我在项目里发现了一个“神秘文件“——.editorconfig

天早上,我像往常一样打开公司的老项目,准备加个新功能。Git pull 完一刷新解决方案,突然发现项目根目录多了一个文件——.editorconfig。 说实话,我的第一反应是:"谁这么闲?VS Code 的配置文件都传到代码仓库里来了?" 正准备右键删除,旁边的技术大佬瞄了我一眼,悠悠地说了句:"删了它,你今晚的 Code Review 可能会不太好过。"

ultramand的博客,重生之我在cad上二次开发猛猛敲C#代码~ 608

F# 简介

概述 F# 是微软公司推出的一种新的功能性编程语言。尽管它主要是一种功能性编程语言,但它却因多范式语言而知名,因为它还支持面向对象编程。F# 与整个 .NET 库系统和开发环境紧密集成,因此开发人员能够将功能性编程功能引入 .NET 平台。目标 在本次动手实验中,您将学习如何: •              使用 F# 类型•              利用 let 关键字

王以山的专栏 2246

为什么说微软的F#是一门被低估的编程语言?

更重要的是,F# 拥有一个非常强大的类型系统,这使得在实现之前,通过 AI 模型准确建模问题,能够有效捕获潜在的幻觉错误。在我早期职业生涯中,我曾接触过 .NET 和 Java,尽管 .NET 在某些方面比 Java 做得更好(毕竟它有机会从 Java 早期的错误中吸取教训),但我最终选择了 Java,因为它是真正的跨平台环境。2010 年,随着 F# 2.0 的发布,F# 从微软研究院转移到微软的开发者工具部门,成为正式支持的开发语言。总体而言,这两者都是强大但小众的语言,未来很难进入主流。

优快云资讯 5089

F# 快速教程

文章目录基础应用绑定变量运算符数据类型基本类型tuple, list, array, seqmapsetrecordDU函数函数复合面向对象class抽象类和接口代码组织脚本编译F#文件在WPF中调用F#代码把F#转为C# F#是微软开发的基于.NET平台的一款面向对象的函数式语言,安装过程非常简单,只需要下载最新版的VisualStudio,在安装的过程中选择F#即可。 创建项目也很简单,只要在VS中新建一个F#项目即可。快捷键F5启动程序,可以在命令行中查看输出。此外,微软还提供了fsi.exe这款命令

微小冷的学习笔记 2622

F#语言的语法

函数的定义是F#编程的核心部分。通过let关键字 可以定义函数,支持参数类型和返回类型的显式声明。fsharpx + yF#凭借其独特的函数式编程特性、强大的类型系统和良好的互操作性,在现代软件开发中展现了极大的潜力。尽管面临一些挑战,F#仍然是开发高效、可靠和可维护应用程序的重要选择。无论是数据科学、Web开发还是金融建模,F#都能为开发者提供强有力的支持。随着越来越多的公司和组织开始认识到F#的优势,预计在未来的编程语言生态中,F#将会占据一席之地。

2501_90195471的博客 788

编程范式: 函数式、命令式、声明式、面向对象

与 声明式编程 是有所关联的;区别 “具体怎么做” 需要开发者自己封装起来的。关注计算机执行的步骤,即一步一步告诉计算机先做什么再做什么。函数式编程是面向数学的抽象,将计算描述为一种表达式求值。声明式编程 是以数据结构的形式来表达程序执行的逻辑。告诉计算机应该做什么,但不指定具体要怎么做。通常需要封装以下函数以提高开发效率。命令式编程就是冯诺伊曼的指令序列。

海胆的博客 840

F# 教程

F# 是一种多范式编程语言,它可以支持面向对象编程、函数式编程和并发编程。Framework上得到了广泛的应用,它的语法非常简洁,而且易于学习。本篇文章将介绍 F# 的基础知识和一些重要的语法概念。

weixin_46121540的博客 772

F#语言的计算机基础

F#最初由Microsoft Research开发,并在2010年作为一个正式的.NET语言发布。它是基于ML语言系列的,强调了类型安全和函数式编程的特性。由于其与.NET平台的紧密集成,F#能够与C#、VB.NET等其他.NET语言无缝协作,成为开发高性能应用程序的理想选择。F#语言的核心思想是以函数为中心,强调“函数是头等公民”。这意味着函数可以作为参数传递、作为返回值返回,甚至可以动态创建。F#还具备强大的类型推断机制,极大地减少了冗余的类型声明,使得代码更加简洁和易读。F#中函数的定义非常简单。

2401_90086266的博客 528
上一篇: F#真棒 - 决策树 - 第一部分
下一篇: 玩转F#中的链表
fsharp_net
博客等级 码龄15年 20粉丝 17原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值