为什么函数绑定到它们传递的第一个类型

2024-03-15

我是 F# 新手。我在闲逛,发现了一些有趣的东西,我希望有人能启发我了解幕后发生的事情。

所以我做了这个功能:let my_func (x, y) = x + y.

然后我用参数调用该函数1 and 2给我3。这是我期望发生的事情,但是当我将两个字符串传递给my_func尽管我得到了一个错误+是一个有效的字符串运算符。我重新运行我的代码,但这次只调用my_func with "cat" and " dog"这给了我"cat dog"。然后我尝试通过1 and 2回到my_func才发现my_funclong 不接受整数。

Why is my_func有这样的行为吗?

let my_func (x, y) = x + y
my_func (1, 2) // produces => 3
my_func ("cat", " dog") // Error

重新运行程序...

let my_func (x, y) = x + y
my_func ("cat", " dog") // produces => "cat dog"
my_func (1, 2) // Error


@MarcinJuraszek 向您展示了如何解决这个问题,但没有提及why它发生了。

你可以这样想:

F# 的类型推断有效从上到下, 左到右- 所以当系统尝试查找类型时my_func它会发现从您使用该函数的第一行开始分配类型(第一个示例是ints,第二个是strings) - 如果您根本不使用它或在 FSharp Interactive 中定义它,它确实会默认为int.

将函数声明为inline使 F# 能够使用静态解析类型参数 http://msdn.microsoft.com/en-us/library/dd548046.aspx(由于一些细节,这只能通过inline函数)然后它确实会做类似的事情鸭子打字从声明中找出该函数需要类型,其中静态+运算符以某种方式定义。

您可以在函数的类型中看到这一点:

val inline my_func :
  x: ^a * y: ^b ->  ^c
    when ( ^a or  ^b) : (static member ( + ) :  ^a *  ^b ->  ^c)

这个相当复杂的类型说明了这一点:

必须有静态运算符(+) : ^a * ^b -> ^c on ^a (think 'a)在你写的时候使用+在函数体内。正如您所看到的,这比您真正需要的更通用,但这不是问题。 F# 将为您应用的此函数的每次出现实现具体版本(用泛型类型替换)(因此在您的示例中将有两个my_funcIL 中的实例化;一个为Ints 和 1 为Strings) - 但这根本不会在设计时打扰您。

所以你现在拥有了更多generic可以与以下函数一起使用的函数:

  • (+) : Int * Int -> Int on Int
  • (+) : String * String -> String on String
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么函数绑定到它们传递的第一个类型 的相关文章

  • F# 参数传递

    我一直认为 F 有两种不同的方式来传递参数 柯里化风格和元组风格 这实际上是正确的吗 是不是很简单一种风格 柯里化风格和参数可以是简单值或元组 e g someFunc a b 这不是一个函数吗one咖喱风格的参数恰好是一个元组 因此允许我
  • 如何在 F# 中将对象转换为泛型类型列表

    在下面的代码片段中 我的目的是将 System Object 可能是 FSharpList 转换为它所持有的任何泛型类型的列表 match o with list lt gt gt addChildList o gt list lt gt
  • 管道序列中的异常处理

    我正在开发一个基本的 2D CAD 引擎 管道操作符显着改进了我的代码 基本上 有几个函数从空间中的点 x y 开始 并在多次移动操作后计算最终位置 let finalPosition startingPosition gt moveByL
  • F# 获取随机数列表

    我正在尝试用随机数填充列表 但很难获得随机数部分 我现在打印出一个随机数 10 次 我想要的是打印出 10 个不同的随机数 let a new System Random Next 1 1000 let listOfSquares for
  • F# 类型提供程序与 Lisp 宏

    我一直在阅读有关 F 3 0 类型提供程序的内容 例如here http msdn microsoft com en us library hh156509 aspx 并且它们似乎基于一种编译时代码生成 在这方面我想知道它们与 Lisp 宏
  • 该表达式的类型为 int,但此处与 unit 类型一起使用

    我试图在 F 中获得与此 vb net 代码完全相同的 非功能性的 Function FastPow ByVal num As Double ByVal exp As Integer As Double Dim res As Double
  • F# nameof 运算符不是一等函数

    我正在使用 F 4 7
  • 单位安全平方根

    我只是想知道如何以与 F 正确交互的方式编写用户定义的平方根函数 sqrt 单位制 http blogs msdn com andrewkennedy archive 2008 09 04 units of measure in f par
  • 在 Deedle 系列中算得上独一无二

    我想对我的数据框中的系列有一个概述 例如 pandas 的唯一值计数 我不知道是否有内置函数可以实现这一点 到目前为止 我已经完成了一个函数来获取不同特征的数量 我可以设法完成这项工作 我的问题只是关于内置功能 let unique s D
  • F# 命名约定

    F 是否有 官方 命名 大小写约定 我总是怀疑是否使用 C 风格 Class MyFunctionName or Module my function name 在 F 中 您应该混合 BCL 类和 F 库类 它们具有不同的大小写 并且代码
  • 何时评估 F# 函数调用;懒惰地还是立即地?

    F 中的柯里化函数 我知道传入参数子集会产生一个带有预设的函数 我只是想知道传递所有参数是否有什么不同 例如 let addTwo x y x y let incr a addTwo 1 let added addTwo 2 2 incr是
  • 如何从引用的表达式匹配中获取模块、函数等的 F# 名称

    我继续开发 F 引用表达式的打印机 它不一定是完美的 但我想看看有什么可能 中的活跃模式Microsoft FSharp Quotations Patterns and Microsoft FSharp Quotations Derived
  • 为什么无法在 F# 项目中添加子文件夹?

    在大多数 NET项目中 我可以使用文件夹来组织代码文件 在 C 中 我不能 但过滤器最终会扮演相同的角色 但是 在 Visual Studio 2010 中的 F 中 我不能 每个代码文件都直接显示在项目目录中 为什么这个功能不可用 组织包
  • F# 静态成员类型约束

    我正在尝试定义一个函数 factorize 它使用类似于 Seq sum 的结构类型约束 需要静态成员 Zero One 和 以便它可以与 int long bigint 等一起使用 似乎无法获得正确的语法 并且无法找到有关该主题的大量资源
  • F# 中的自定义路由事件

    我正在尝试翻译这段 C 代码 https msdn microsoft com en us library ms752288 aspx 到目前为止我的尝试 type MyButtonSimple as self inherit Button
  • 如何从 C# 调用 F# 类型扩展(静态成员函数)

    FSharp 代码的结构如下 我无法控制源代码 namespace FS
  • 如何让一条记录实现一个接口?

    如果我有一个界面 type IData abstract member firstName string abstract member lastName string 如何定义符合此接口的记录类型 我尝试了如下所示 gt type Dat
  • 使用 System.Text.Json 序列化记录成员

    我在记录中使用自我引用成员 如下所示 type Payload Id Guid member x DerivedProperty Derived Property using id x Id NewtonSoft Json会序列化这个 但是
  • 从静态成员访问 let 绑定字段

    有没有办法从静态成员访问 let 绑定字段 下面给出了指示的错误 type Foo x let x x static member test let foo Foo System DateTime Now Month printfn A f
  • F#:如何将 Json.NET [JsonConstructor] 属性应用于主构造函数?

    我正在尝试用 F 做一些事情 比如JsonConstructorAttribute中的示例Json NET 文档 http www newtonsoft com json help html JsonConstructorAttribute

随机推荐

  • Python中如何获取当前执行文件的路径? [复制]

    这个问题在这里已经有答案了 有没有普遍的Python中的方法 找出当前正在执行的文件的路径 失败的方法 path os path abspath os path dirname sys argv 0 如果您从另一个目录中的另一个 Pytho
  • Django 中的条件登录重定向

    我知道关于LOGIN REDIRECT URL我知道
  • 如何以 CSV、C、Python、MatLab、NumPy 样式格式打印 cv::Mat

    我有一个 OpenCV 矩阵 我想以问题中提到的任何样式打印它 cv Mat1b image cv imread input name cv IMREAD GRAYSCALE std cout lt lt format in c style
  • Xna 绘制顺序无法正常工作

    我有一个 Texture2D 的二维数组 它在该数组中保存地图的不同部分 不过 我有一个问题 当我运行游戏时 地图绘制正确 但由于某种原因 数组 0 0 纹理重叠了我的所有纹理 包括我的玩家纹理和鼠标纹理 当我的鼠标和玩家纹理正确重叠地图时
  • 如何在 couchdb 中编写通配符搜索查询,其中名称如“a%”

    如何在 couchdb 中编写通配符搜索 我想在 sql 中编写与 LIKE 相同的查询 请帮助我 name arun surname mr name balu surname tp 我需要列出所有以 a 开头的名称 Thanks 在 co
  • 有关对齐的问题

    在函数内的局部作用域中声明时将所有相同类型的变量分组在一起是一个好习惯吗 如果是 为什么 它能解决内存对齐问题吗 我认为这对我 20 年前使用的 VAX C 编译器很重要 但对任何现代编译器都没有影响 这是not可以安全地假设局部变量将按任
  • 在 LISP 中实现基本库函数(手动)

    有什么方法可以定义函数my list my cons my append其执行类似的功能list cons and append分别 否则哪里可以找到这些功能的实现呢 Thanks 对于my list和my append 解决方案是 def
  • 在 Windows 上部署 QML 应用程序的正确方法

    最近 我需要为我的 Qt QML 应用程序创建一个部署包 这个过程非常繁琐 因为您需要手动查找并复制依赖项 正如 官方 中所述Qt Wiki https wiki qt io Deploy an Application on Windows
  • 如何将动态创建的文本字段值发送到 php 邮件

    input type radio click function val this val container html content val this attr count var i 1 for i 0 i lt val i conte
  • 可以在 Oracle 的 SELECT 中执行自动编号序列吗?

    我需要在 Oracle 中完成一项任务 但我不知道如何才能做到这一点 好的 当我动态定义自动编号序列时 我需要执行 SELECT 例如 Select autonumber 1 9000 as auto from some table 结果是
  • ng2-ckeditor 404(未找到)

    我使用 cmd npm install ng2 ckeditor 添加了 ng2 CKEDitor 安装得很好 有一个例子https www npmjs com package ng2 ckeditor https www npmjs co
  • 无法使用 psycopg2 连接到 Postgres 容器

    我有以下设置 容器中的一个简单 Flask 应用程序 Postgres 容器 使用以下 Dockerfile FROM python alpine3 7 COPY app WORKDIR app RUN apk update RUN apk
  • Eclipse 调试配置中的默认 VM 参数?

    当我使用 TDD 实现新功能时 我经常使用快捷方式Shift Alt D T仅运行我当前正在处理的 jUnit 测试用例 而不是整个测试套件 这需要几分钟 这将为当前 Java 源创建一个新的调试配置并立即运行它 现在我想在启用断言的情况下
  • AutoCompleteTextView 未完成括号内的单词

    我已经实施了AutoCompleteTextView如下 MainActivity java public static String myData new String Africa AF America AFM Apple AMP te
  • 将自定义数据嵌入到不会被 ld.so 映射的 ELF 文件中

    我有一个 500MB 的文件 其中包含一些自定义数据 即 ZIP 存档 我想将它嵌入到我的 ELF 可执行文件中 这样当我分发 ELF 文件时 我将只能发送 1 个文件而不是 2 个文件 问题是我不希望在我的应用程序启动时操作系统自动加载这
  • 在 Entity Framework 4.0 中批处理 DB 命令

    我当前的项目需要每天与外部系统同步 同步基于复杂的导入文件结构 该结构通过广泛的业务逻辑进行解析和处理 由于业务逻辑的原因 我们决定在 NET 代码中进行此操作并重用现有的 BL 组件 而不是在存储过程或集成服务中编写相同的逻辑 BL 层位
  • .Net 中的单元测试属性?

    我正在开发一个我想以开源方式发布的库 我已经开始为代码编写测试 我想知道如何测试 Net 对象中的属性 可以说我有以下内容 public class Person region variables private string name S
  • 生成三角/六角坐标 (xyz)

    我试图提出一个迭代函数来生成六角形网格的 xyz 坐标 使用起始六边形位置 为简单起见 假设为 0 0 0 我想计算每个连续的六边形 环 的坐标 如下所示 到目前为止 我所能想到的就是这个 javascript 中的示例 var radiu
  • 具有 AsynchronousServerSocketChannel 的多线程服务器

    我必须实现一个应该接受更多连接的服务器 没有任何更深入的思考 我决定使用新的 JAVA NIO 2 类 我目前的做法是 final Semaphore wait new Semaphore 1 while true wait acquire
  • 为什么函数绑定到它们传递的第一个类型

    我是 F 新手 我在闲逛 发现了一些有趣的东西 我希望有人能启发我了解幕后发生的事情 所以我做了这个功能 let my func x y x y 然后我用参数调用该函数1 and 2给我3 这是我期望发生的事情 但是当我将两个字符串传递给m