Nemerle 和 F# 在 .Net 上的功能比较

2024-01-23

社区维基问题:

根据这个问题:在.Net 中使用 Scala 有什么好处? https://stackoverflow.com/questions/3587499/what-are-the-benefits-of-using-scala-in-net我想到了另一个问题。谁能列出以下的比较优势(和劣势)Nemerle http://nemerle.org/Main_Page和F#在.Net平台上进行功能开发?我只是顺便看了一眼内梅尔。听起来它与 F# 的功能大致相同,所以我想知道除了明显的语法差异以及 F# 得到 Microsoft 支持的巨大优势之外,还有什么差异。


我接触过这两种语言,对 Nemerle 的印象简要如下:(我假设大多数观众都熟悉 F#,而 Nemerle 不太受欢迎,所以为了公平起见,我会多介绍一些):

  • F# 社区相当大,并且由于大量的博客文章、文章等而不断增长。而且它分布在各个国家/地区。相反,Nemerle 爱好者基本上都讲俄语,并且专注于RSDN.ru http://rsdn.ru/forum/nemerle site.
  • 在我看来,Nemerle 语法对于具有类 C 语言背景的开发人员来说更加友好。
  • Nemerle(以及 F#)具有类型推断功能。 Nemerle 中的类型推断机制绑定到方法体(局部函数、变量等),与 F# 全局类型推断作用域相反。然而,Nemerle 编译器并不强制执行任何特定的代码编写习惯来辅助类型推断机制。

F#

open System.Text

let l = [1; 2; 3]
let r1 = l |> List.fold(fun (sb : StringBuilder) v -> sb.Append(v).AppendLine()) (StringBuilder()) // type annotation is required on the function argument
let r2 = (StringBuilder(), l) ||> List.fold(fun sb v -> sb.Append(v).AppendLine()) //here compiler can infer type of State parameter 

Nemerle

using System.Console; 
using System.Collections.Generic; 
using System.Text; 

def l = [1,2,3]; 
def res = l.FoldLeft(StringBuilder(), (v, acc) => acc.Append(v).AppendLine()); 
WriteLine($"Result:\n$res"); 

def d = Dictionary(); // generic parameters are absent (even placeholders!!!) 
d.Add(1, "!"); 
WriteLine(d.GetType()); // System.Collections.Generic.Dictionary`2[System.Int32,System.String] 

此外,您可能会注意到 Nemerle 编译器的另一个功能 - 它可以从进一步的使用中推断出类型。为了推断类型,F# 使用基于 Hindley-Milner 算法的方法并尝试推断最通用的类​​型。相反,Nemerle 从不推断多态类型,并且总是寻找最具体的类型。

F#

let addInt = (+) 5
let addString = (+) "!!!"

let run f x = f (f x) // ('T -> 'T) -> 'T -> 'T

run addInt 5
run addString "S"

Nemerle 在相同条件下会推断出类型runas (int->int) * int -> int。

关于 Nemerle 类型推理机制的更多细节可以参见 Michal Moskal 的硕士论文:延迟类型推断 http://research.microsoft.com/en-us/um/people/moskal/pdf/msc.pdf

  • Nemerle 拥有丰富的元编程能力。大多数语言控制结构,如循环、条件表达式、LINQ 支持、即将推出的解析功能(包括 C# 源代码等等)——所有这些都是使用宏创建的。可以找到一个宏应用程序示例here http://v2matveev.blogspot.com/2010/08/inotifypropertychanged-strikes-back.html。顺便说一句,字符串格式化功能$上面示例中的语法 - 也是内置宏。

EDIT:添加了稍大的样本

using System.Console;
using System.Collections.Generic;
using System.Text;

variant Expr
{
  | Const { value : double }
  | Var { name : string }
  | Operation { id : string; left : Expr; right : Expr }

  public Eval(operations : Dictionary[string, double*double -> double], context : Dictionary[string, double]) : double
  {
    match(this)
    {
        | Const (value) => value
        | Var(name) => context[name]
        | Operation(id, left, right) => 
            def f = operations[id];
            f(left.Eval(operations, context), right.Eval(operations, context))
    }
  }
}

module Program
{
    public Main() : void
    {
        def expr = 
            Expr.Operation(
                "*",
                Expr.Const(10),
                Expr.Operation(
                "+",
                Expr.Var("n"),
                Expr.Const(5)
                )
            );
        def operations = Dictionary.[string, double * double -> double]();
        operations["+"] = (x, y) => x + y;
        operations["*"] = _ * _;

        def vars = Dictionary();
        vars["n"] = 3.0;

        def result = expr.Eval(operations, vars);
        WriteLine($"Result is $result");
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Nemerle 和 F# 在 .Net 上的功能比较 的相关文章

  • 服务具有零个应用程序(非基础设施)端点

    我最近创建了一个WCF服务 dll 和一个服务主机 exe 我知道我的 WCF 服务工作正常 因为我能够成功地将服务添加到 WcfTestClient 但是 当我从服务主机 exe 使用 WCF 时 我似乎遇到了问题 我可以将对 WCF d
  • 在 .NET 中使用 Settings.settings 文件时,配置实际存储在哪里?

    在 NET 中使用 Settings settings 文件时 配置实际存储在哪里 我想删除保存的设置以返回到默认状态 但找不到它的存储位置 有什么想法吗 这取决于您选择的设置是在 用户 范围还是 应用程序 范围 用户范围 用户范围设置存储
  • WPF 元素宿主内存泄漏

    我在 Windows 窗体上使用元素主机时遇到奇怪的内存泄漏 我有一个主窗体 它打开另一个窗体 该窗体上只有 elementhost 控件 此时 它没有 wpf 控件子控件 只能打开 1 个主机表单 每次我打开窗体时 应用程序内存都会增加2
  • log4net 仅在调用 XmlConfigurator.Configure() 时起作用

    我明白那个this https stackoverflow com questions 445976 log4net config in external file does not work 1479343 1479343 questio
  • 去除字符串的最佳方法是什么?

    我需要具有最佳性能的想法来删除 过滤字符串 I have string Input view 512 3 159 删除 view 和 的最佳性能方法是什么 和引号 我可以做这个 Input Input Replace view Replac
  • Spring.NET 和构造函数拦截器

    我正在尝试在构造时对对象进行一些 AOP 并找到了 IConstructorInterceptor 这对于我想要的东西来说是完美的 但它似乎不起作用 http jira springframework org browse SPRNET 2
  • IL 的仿制药?

    是否可以在 IL 生成器中使用泛型 DynamicMethod method new DynamicMethod GetStuff typeof int new Type typeof object ILGenerator il metho
  • 正则表达式不等于字符串

    我用正则表达式用头撞墙 我正在尝试定义一个表达式 该表达式完全排除此文本 System 不区分大小写 但可以包含 系统 这个词提供的不仅仅是这个 例子 系统 无效 系统 无效 系统 无效 系统 无效 asd 系统 有效 asd 系统 asd
  • C# Julian 日期解析器

    我在电子表格中有一个单元格 它是 Excel 中的日期对象 但当它来自 C1 的 xls 类时 它会变成双精度型 类似于 2009 年 1 月 7 日的 39820 0 我读到这是儒略日期格式 有人可以告诉我如何在 C 中将其解析回 Dat
  • 更换 I 过滤器

    我目前正在使用 IFilters 从各种文件 word excel tiff pdf 等 中提取文本 据我所知 IFilter 已在 Windows 8 中停止使用 是否有人对如何在不安装本机应用程序的情况下提取文本有任何建议 如果有什么用
  • 找不到 Microsoft.Office.Interop Visual Studio

    我正在开发一个使用 C 发送电子邮件的应用程序 该应用程序将能够使用邮件模板等 问题是我无法找到任何 Office Interop 引用 这意味着我无法使用 Outlook 我的计算机上安装了 Office 但我也尝试从此链接安装 PIAh
  • 在 .Net 托管的 IronPython 脚本中设置和获取变量

    我正在尝试使用 Net 控制台应用程序中托管的 IronPython 来构建验证规则引擎的原型 我已经将脚本精简到我认为的基础内容 var engine Python CreateEngine engine Execute from Sys
  • 在 C# 中使用通配符解析相对路径

    在 C 中 如果我有一个目录路径和一个带通配符的相对文件路径 例如 c foo bar and blah cpp 有没有一种简单的方法来获取绝对文件路径列表 例如 c foo blah a cpp c foo blah b cpp 背景 有
  • C# - 方法必须有返回类型

    我在调用 C 中的方法时遇到问题 不断收到消息 方法 计算 必须有返回类型 using System Diagnostics namespace WindowsFormsApplication1 public partial class F
  • c#.NET 和 sprintf 语法

    这段代码如何翻译成 C 具体来说是如何sprintf用C 实现 string output The user s logged in string loggedIn is string loggedOut isn t if TheUser
  • 使用.Net/C# 计算集合的频率分布

    是否有一种快速 简单的方法来使用 Linq 或其他方式计算 Net 集合的频率分布 例如 任意长的 List 包含许多重复项 遍历列表并计算 跟踪重复次数的巧妙方法是什么 查找列表中重复项的最简单方法是将其分组 如下所示 var dups
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 如何在 Linq to SQL 中使用distinct 和 group by

    我正在尝试将以下 sql 转换为 Linq 2 SQL select groupId count distinct userId from processroundissueinstance group by groupId 这是我的代码
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • 如何在 HTML 中嵌入流媒体视频 (rtmp)

    如何在 HTML 中嵌入流媒体视频 rtmp 链接rtmp http 42 116 119 44 4022 udp 225 1 2 244 30120 http 42 116 119 44 4022 udp 225 1 2 244 3012
  • 将 (u)int64_t 转换为 NSNumber

    所以本质上我的问题是这样的 我正在使用 uint64 t 对象作为键创建一个 NSMutableDictionary 还有比这样做更好的方法来创建它们吗 uint64 t bob 7 NSNumber bobsNumber if LP64
  • Android Studio 插件 Fabric 中出现异常

    我已经安装了最新的面料插件 https get fabric io beta对于 Android Studio 它运行良好一段时间 更新到 Android Studio 1 1 0 后 我在事件日志中看到以下内容 以及 NullPointe
  • 括号:如何使自动完成/自动缩进工作?

    括号看起来不错 但我在使用它时遇到两个问题 First 我通常这样自动完成标签 div class PRESS TAB becomes div class class div 我无法实现这一点 我尝试下载一堆插件 但没有任何作用 Secon
  • 使用 ActiveMQ/Stomp 在 PHP 和 Java 之间进行通信

    背景 我有两个服务需要通过消息队列相互通信 一种是用 PHP 编写的遗留服务 另一种是用 Java 编写的 迟早 PHP 服务将被 Java 重写 它们当前相互通信的方式是写入共享数据库 由其他服务轮询 这就是我试图摆脱并用消息队列替换的内
  • 仅限 AJAX 的 Javascript 库

    我正在寻找一个只有 AJAX 没有其他功能的 Javascript 库 例如一个小型的简单 XMLHttp 包装器 微贾克斯 http code google com p microajax 这是我决定的
  • 如何让 Material-UI 选项卡与 React-router 一起使用?

    我正在尝试让 Material UI 选项卡与路由一起使用 当路由正在工作并显示所选选项卡时 选项卡之间导航的流畅动画不再起作用 如何将 React Router 与 Material UI 选项卡一起使用 以保持选项卡动画正常工作 截至目
  • 最快重合矩阵

    我有两个数组 我想计算一个巧合列表 数组 即所有索引 i j 的列表 使得 a i b j 这是我现在的代码 b np array 3 5 6 4 a np array 1 2 3 4 np array i j for i in range
  • 如何获取每个权限的保护级别?

    我试图列出所选应用程序中每个权限的保护级别 对于下面给出的代码 但我不知道如何完成它 ArrayList
  • 根据另一个依赖项的版本使用不同的代码

    以下情况 库 X 由我维护 依赖于库 Y 版本 2 0 对于库 Y 存在较新的主要版本 3 该版本通常更好 将基于 Y 2 构建的代码升级到 Y 3 非常简单 但仍然需要对现有代码进行一些调整 Y 是 X 的依赖项 因此升级它会迫使 X 的
  • 还有人知道这是什么意思吗?

    static final boolean assertionsDisabled java util TaskQueue desiredAssertionStatus 在源文件中看到的java util TaskQueue java Quot
  • Kotlin:公共获取私有设置变量

    在 kotlin 中定义具有公共 getter 和私有 仅内部可修改 setter 的 var 的正确方法是什么 var setterVisibility String abc Initializer required not a null
  • 该证书的颁发者无效:钥匙串将所有证书标记为“无效颁发者”[重复]

    这个问题在这里已经有答案了 钥匙串突然将我的钥匙串中的所有证书显示为无效 因为它在 2 天前工作 我还检查了开发人员门户 它在那里显示有效 它将钥匙串中的每个证书标记为 该证书的颁发者无效 正如消息表明 这一定是发行人方面的问题 而我们的发
  • InternalResourceViewResolver 与 UrlBasedViewResolver 有何不同

    我刚刚开始使用Spring 我遇到了很多教程 我看到了更多使用的例子InternalResourceViewResolver than UrlBasedViewResolver 我查看了 Spring 文档 但我无法弄清楚使用其中之一的好处
  • 尝试使用 FragmentActivity 时无法访问 ActivityCompat Api 23

    我尝试在我的智能手表上使用 ViewPager 但在尝试重建 运行 调试我的应用程序时不断收到错误 我正在使用 FragmentActivity 这就是发生错误的地方 我搜索了 stackoverflow 和教程网站来看看可能是什么问题 很
  • 为什么没有“国外进口原药不安全”?

    这是我之前问题的后续here https stackoverflow com questions 41213378 using foreign import prim with a c function using stg calling
  • 在现有的 Ruby on Rails 应用程序中创建博客

    我有兴趣向我的 Ruby on Rails 应用程序添加博客 我不想浪费时间在 Rails 中编写 bloggin 应用程序 我可以做到 但我只是更喜欢更强大的东西 我研究过 Wordpress 它似乎是最好的博客平台之一 我的问题是如何将
  • 实体框架返回旧数据

    我遇到了 EF 无法在 3 层 WPF 应用程序中返回最新数据的问题 我怀疑这与我处理上下文生命周期的方式有关 这是场景 UnitOfWork 内包含多个存储库 还有一项服务 MyService 它使用 UnitOfWork 此 UnitO
  • 使用朴素贝叶斯分类器对推文进行分类:一些问题

    除了其他来源之外 我还使用 Stackoverflow 上的各种帖子 尝试实现自己的 PHP 分类器 将推文分为正面 中性和负面类别 在编码之前 我需要理清流程 我的思路和例子如下 p class p words class Bayes t
  • Nemerle 和 F# 在 .Net 上的功能比较

    社区维基问题 根据这个问题 在 Net 中使用 Scala 有什么好处 https stackoverflow com questions 3587499 what are the benefits of using scala in ne