草庐IT

.net - F# 与 IronPython : When is one preferred to the other?

coder 2023-05-23 原文

虽然 F# 和 IronPython 语言在技术上不同,但在我看来,它们的潜在用途之间存在很大的重叠。什么时候一种比另一种更适用?

到目前为止,在我看来,F# 在计算上更高效,而 IronPython 从 Python 继承了一个更好的库。我很高兴得到纠正。

有一个有点相关的问题 is F# to IronPython/IronRuby as C# is to VB.NET?但是那里的大多数答案都与语言范式有关,而不是它们的实际适用性。

编辑 : 我想我应该添加更多背景。总的来说,我对 Python 有很好的经验,并且在之前的几个犹豫不决的函数式编程步骤之后刚刚学习了 F#,主要是在 Erlang 中。我目前觉得将来可以继续使用 Python 或 F#。我想决定我应该使用哪一个以及在哪里。例如:

  • 作为标准库的一部分,Python 具有非常好的数据结构。前几天我需要一个相当于 Python 的 heap模块,它在标准 F#/.net 库中不可用。指向 IronPython。
  • F# 可用于构建更方便的库,更易于从其他 .Net 语言访问。因此,对于 .Net 驻留库,我更喜欢 F#。
  • 跨平台开发。 IronPython 在这里更好。 F#/Mono 可用的平台要小得多,而且 F#/OCaml 兼容性不容易维护,尤其是在库方面。
  • IronPython 交互式 shell 在我看来比 fsi 更容易。天啊。

  • 所以问题归结为:除了对一种范式的偏爱或某些团队或公司的偏爱之外,是否有任何原因会让您选择 F# 而不是 IronPython,反之亦然?假设你对两者都同样有信心?或者它们在所有实际用途上都完全相同吗?

    编辑 :好的,伙计们,看起来您认为这是一个愚蠢的问题,对它和答案投了反对票。但至少它是诚实的。所以请只是一个提示。是否无法区分两者,或者我问这个问题是否进入了一些 secret 禁忌?如果它看起来像巨魔,有人可以告诉我吗?

    最佳答案

    So the question boils down to: are there any reasons, apart from a preference of one paradigm to another or some team or corporate preferences, that would make you pick F# rather than IronPython or vice versa? Assuming you are equally confident in both? Or are they exactly equivalent for all practical purposes?



    通常情况下,“这取决于你在做什么”但是既然你问了,就从这里开始:

    工具集多样性

    在我看来,IronPython 本质上与 C# 相同,但语法略有不同——我知道,它是对具有完全不同类型系统的两种语言的全面概括,但对于另一种命令式,我无话可说,OO语言。无论是 C#、Java、C++ 还是 Python,您都使用大致相同的技术、习惯用法、策略、风格等来解决语言问题。如果您是 .NET 开发人员,那么您几乎肯定使用过 C# 或 VB。 NET,并且只要您一直在使用这些语言,您就已经在以命令式风格编写代码。

    支持 F# 的最大的一点就是它鼓励更多的函数式编程风格,通过 OO 继承淡化抽象,支持函数组合,将不变性作为默认值而不是事后的想法,等等。如果要编写函数式代码,则需要使用函数式语言。

    当然,您可以用 C# 和 Python 编写函数式风格,但函数式特性是事后才嫁接的。 Python 缺少多行 lambda,C# 过于冗长,偶尔 buggy为了在你想用的地方使用函数式风格,C#特别有一个完整的boatload of gotchas关于委托(delegate)和捕获局部变量,这两种语言几乎在您想要使用它们的任何地方都缺乏尾调用优化,与 F# 相比,C# 的类型推断是一个笑话。我试过使用 C# 作为一种函数式语言,但结果非常糟糕:)

    现在大多数人可能会承认问题使使用 C# 或 Python 以函数式风格编程变得困难,但并非不可能。但是,根据我的经验,不是语言使之成为不可能,而是您团队中的程序员。如果您有 10 或 12 个人用命令式语言编写代码,那么您将无法长期强制执行函数式风格——这些语言不会采取任何措施来阻止命令式风格。由于程序员已经以这种风格编码,这就是你所得到的。除非你的团队中有一些真正的铁杆和有点自虐的 FP 爱好者,否则我认为不能在命令式语言中强制执行纯函数式编程风格很长时间。

    支持 F# 的最佳论据不一定是函数式编程本身,而是工具集的多样性。与将 IronPython 和 C#(相同的编程范式和不同的类型系统)配对相比,将 F# 和 C#(不同的编程范式和类似的类型系统)配对可以获得更大的 ROI。

    我公司案例

    好吧,话虽如此,我一直在努力在我的公司插入 F#。我不会详细介绍我们的工作,但基本上我的团队会指导用户完成为时代华纳、ComCast 和其他有线电视提供商等公司订购有线电视和电话服务的过程。

    它确实是一个比听起来更复杂的过程。首先,有一个复杂的规则引擎,用于确定产品的可用性、产品之间的依赖关系和排除等。我们遍历规则引擎图并从中构建决策树,然后将树交给客户端,以便他们可以将其显示给用户并收集用户输入,客户端将 GUI 映射回我们的决策树结构,我们遍历树并根据规则引擎验证所有内容,等等。

    我想说我们 95% 的代码只是导航、操作和处理树状数据结构。现在,我们编写的所有内容都是 C# 并且有点乱。顺便说一句,F# 的优势之一是操纵 AST 和符号处理(参见 C# and F# code for processing ASTs 的比较),这一切皆有可能,因为模式匹配很棒。

    模式匹配是一个真正的杀手级功能,正是我们的 C# 代码需要清理它的功能,这就是我们需要 F# 的原因。我们对 IronPython 没有任何用处,因为它在符号处理方面并不比 C# 好。

    摘要

    函数式编程范式和模式匹配是我每天都喜欢使用 F# 的两个杀手级功能。我可以去 F# 的 async线程模型、消息传递并发原语、对 monad 的支持、事件模式等新颖功能等,但这些都是要点注释。对我来说,这两个杀手级功能使 F# 胜过 Python 成为可能——至少对于我自己的项目是这样。

    关于.net - F# 与 IronPython : When is one preferred to the other?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3327885/

    有关.net - F# 与 IronPython : When is one preferred to the other?的更多相关文章

    1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

      作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

    2. ruby - 如何模拟 Net::HTTP::Post? - 2

      是的,我知道最好使用webmock,但我想知道如何在RSpec中模拟此方法:defmethod_to_testurl=URI.parseurireq=Net::HTTP::Post.newurl.pathres=Net::HTTP.start(url.host,url.port)do|http|http.requestreq,foo:1endresend这是RSpec:let(:uri){'http://example.com'}specify'HTTPcall'dohttp=mock:httpNet::HTTP.stub!(:start).and_yieldhttphttp.shou

    3. ruby - Net::HTTP 获取源代码和状态 - 2

      我目前正在使用以下方法获取页面的源代码:Net::HTTP.get(URI.parse(page.url))我还想获取HTTP状态,而无需发出第二个请求。有没有办法用另一种方法做到这一点?我一直在查看文档,但似乎找不到我要找的东西。 最佳答案 在我看来,除非您需要一些真正的低级访问或控制,否则最好使用Ruby的内置Open::URI模块:require'open-uri'io=open('http://www.example.org/')#=>#body=io.read[0,50]#=>"["200","OK"]io.base_ur

    4. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

      1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

    5. .net - .NET 将如何影响 Python 和 Ruby 应用程序? - 2

      我很好奇.NET将如何影响Python和Ruby应用程序。用IronPython/IronRuby编写的应用程序是否会非常特定于.NET环境,以至于它们实际上将变得特定于平台?如果他们不使用任何.NET功能,那么IronPython/IronRuby相对于非.NET同类产品的优势是什么? 最佳答案 我不能说任何关于IronRuby的东西,但是大多数Python实现(如IronPython、Jython和PyPy)都试图尽可能忠实于CPython实现。不过,IronPython正在迅速成为这方面的佼佼者之一,并且在PlanetPyth

    6. ruby - 如何使用 Ruby HTTP::Net 处理 404 错误? - 2

      我正在尝试解析网页,但有时会收到404错误。这是我用来获取网页的代码:result=Net::HTTP::getURI.parse(URI.escape(url))如何测试result是否为404错误代码? 最佳答案 像这样重写你的代码:uri=URI.parse(url)result=Net::HTTP.start(uri.host,uri.port){|http|http.get(uri.path)}putsresult.codeputsresult.body这将打印状态码和正文。

    7. .net - 是否有 Ruby .NET 编译器? - 2

      是否有适用于Ruby语言的.NETFramework编译器?我听说过DLR(动态语言运行时),这是否将使Ruby能够用于.NET开发? 最佳答案 IronRuby是Microsoft支持的项目,建立在动态语言运行时之上。 关于.net-是否有Ruby.NET编译器?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/199638/

    8. ruby - 使用 ruby​​ gem net-ssh-multi 同时在多个服务器上执行 sudo 命令 - 2

      在previousquestion中我想出了如何在多个服务器上启动经过密码验证的sshsession来运行单个命令。现在我需要能够执行“sudo”命令。问题是,net-ssh-multi没有分配sudo需要运行的伪终端(pty),导致以下错误:[127.0.0.1:stderr]sudo:sorry,youmusthaveattytorunsudo根据documentation,可以通过调用channel对象的方法来分配伪终端,但是,以下代码不起作用:它会生成上面的“notty”错误:require'net/ssh'require'net/ssh/multi'Net::SSH::Mul

    9. (附源码)vue3.0+.NET6实现聊天室(实时聊天SignalR) - 2

      参考文章搭建文章gitte源码在线体验可以注册两个号来测试演示图:一.整体介绍  介绍SignalR一种通讯模型Hub(中心模型,或者叫集线器模型),调用这个模型写好的方法,去发送消息。  内容有:    ①:Hub模型的方法介绍    ②:服务器端代码介绍    ③:前端vue3安装并调用后端方法    ④:聊天室样例整体流程:1、进入网站->调用连接SignalR的方法2、与好友发送消息->调用SignalR的自定义方法 前端通过,signalR内置方法.invoke()  去请求接口3、监听接受方法(渲染消息)通过new signalR.HubConnectionBuilder().on

    10. ruby - Net::SSH sudo 命令在输入密码后挂起 - 2

      我一直在尝试使用Thor编写一个小型库,以帮助我快速创建新项目和站点。我写了这个小方法:defssh(cmd)Net::SSH.start(server_ip,user,:port=>port)do|session|session.execcmdendend只是协助我在需要时在远程服务器上运行快速命令。问题是当我需要在远程端的sudo下运行命令时,脚本似乎卡在我身上。例如当执行这个...ssh("sudocp#{file_from_path}#{file_to_path}")脚本会提示我输入密码[sudo]passwordforuser:但是在输入之后整个事情就挂起。有人会碰巧知道它为

    随机推荐