F# 元组类型的模式匹配

2024-01-04

我有一个柯里化函数,我希望它支持不同类型的参数,这些参数不具有继承关系:

type MyType1 = A | B of float
type MyType2 = C | D of int

我试图做的是:

let func x y =
    match (x, y) with
    | :? Tuple<MyType1, MyType1> -> "1, 1"
    | _ -> "..."

然而这是不可能的。 F# 抱怨:

类型 ''a * 'b' 没有任何适当的子类型,不能用作类型测试或运行时强制的源。

执行此操作的优雅方法是什么?

EDIT: 让我试着澄清一下。

我有两种相似但不同的类型。我可以very轻松地将一种类型转换为另一种类型。我想定义一个将作用于这些类型的实体的二元操作,但我想向客户端公开单个操作。

也就是说,不提供:

let op11 (x : MyType1) (y : MyType1) = // do something useful
let op12 (x : MyType1) (y : MyType2) =
    // convert y to MyType1
    let y' = // ...
    // dispatch to op11
    op11 x y'
let op21 (x : MyType2) (y : MyType1) = // similar
let op22 (x : MyType2) (y : MyType2) = // similar

我想要的是将单个函数公开给客户端代码:

let op (x : obj) (y : obj) = // ...

这就像模拟方法重载的行为,但使用柯里化函数。


您的代码不起作用,因为 F# 将参数类型概括为类型参数。我认为你不能动态测试类型是否'a * 'b可以转换为类型MyType1 * MyType2(尽管这对我来说有点令人困惑)。在任何情况下,您都可以编写一个带有两个类型参数的函数obj并使用两个分别测试它们:?图案:

type MyType1 = A | B of float 
type MyType2 = C | D of int

let func (x:obj) (y:obj) = 
    match (x, y) with 
    | (:? MyType1 as x1), (:? MyType1 as x2) -> 
        printfn "%A %A" x1 x2
    | _ -> 
        printfn "something else" 

func A (B 3.0) // A B 3.0
func A (D 42)  // something else

不管怎样,知道你为什么要这样做会很有趣?可能有更好的解决方案...

EDIT (2)因此,从所有 4 个二元素组合T1 and T2,您想要可以接受 3 的函数。这是正确的吗(T1 * T1, T1 * T2 and T2 * T2)?在这种情况下,您无法编写完全安全的柯里化函数,因为第二个参数的类型将“依赖于”第一个参数的类型(如果第一个参数的类型为T2,那么第二个参数也必须是T2(否则可以是T1 too)).

您可以编写一个安全的非柯里化函数,该函数采用以下类型的参数:

type MyArg = Comb1 of T1 * T1 | Comb2 of T1 * T2 | Comb3 of T2 * T2

函数的类型是MyArg -> string。 如果你想要一个柯里化函数,你可以定义一个类型,允许你使用T1 or T2作为第一个和第二个参数。

type MyArg = First of T1 | Second of T2

然后,你的柯里化函数将是MyArg -> MyArg -> string。但请注意,如果不允许使用一种参数类型组合(如果我理解正确的话,T2 * T1不应该被允许)。在这种情况下,您的函数只需抛出异常或类似的东西。

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

F# 元组类型的模式匹配 的相关文章

  • 如何在MVVM中实现appSettings

    我正在尝试摆脱我使用的警告appSettings在 WPF 项目中 应用程序配置
  • 什么是错误“类型实例化涉及 byref 类型。” F# 中的解决方法是什么

    我有一些代码包装 TA Lib 很多包装器非常相似 let sma timePeriod int data float let mutable outStartIndex 0 let mutable outNbElement 0 let m
  • Scala Function.tupled 和 Function.untupled 等效于变量 arity,或者使用元组调用变量 arity 函数

    昨晚我试图围绕接受和调用通用函数做一些事情 即类型在调用站点上已知 但可能因调用站点而异 因此定义应该是跨参数通用的 例如 假设我有一个函数f A B C gt Z 其实这样的还有很多fs 我事先不知道 所以我无法确定类型或数量A B C
  • 从 C# 调用高阶 F# 函数

    给定 F 高阶函数 在参数中采用函数 let ApplyOn2 f int gt int f 2 和 C 函数 public static int Increment int a return a 我怎么打电话ApplyOn2 with I
  • 获取参数类型的参数

    假设我定义了一个这样的类型 type Point Tx Ty end 然后我创建一个这种类型的变量 例如 a Point Int64 something 现在 我只知道我可以获得以下类型a by typeof a 那是 Point Int6
  • 如何将列表转换为元组列表?

    我想转换 z z a z z a a z to z 2 a 1 z 2 a 2 z 1 我该怎么做 所以 我需要累积以前的值 它的计数器和元组列表 我已创建记录 record acc previous counter tuples 重新定义
  • 具有上限的联合类型

    我正在遵循这个问题的公认答案中提出的技术如何定义 类型析取 联合类型 https stackoverflow com questions 3508077 does scala have type disjunction union type
  • F# 和模糊逻辑

    我知道这可能听起来很奇怪 但我想知道 Microsoft Visual F 正在进入的这个新世界中的一件事 这种语言有很多应用 我要学习 关于解析 函数式编程 结构化编程 但是人工智能呢 模糊逻辑有什么应用吗 F 是一种适合模糊逻辑应用程序
  • Async.StartChild是否存在内存泄漏?

    当我运行以下测试 使用 F 2 0 构建 时 我得到 OutOfMemoryException 在我的系统上大约需要 5 分钟才能达到异常 如果它作为 x86 进程运行 则为 i7 920 6gb ram 但无论如何我们都可以在任务管理器中
  • 如何使用 FLinq 在 F# 中进行外连接?

    问题几乎说明了一切 我有一个如下形式的大 flinq 查询 for alias1 in table1 do for alias2 in table2 do if alias1 Id alias2 foreignId 使用这种形式 如何在这两
  • 在 Deedle 系列中算得上独一无二

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

    为什么此 Scala 代码无法进行类型检查 trait T type A trait GenFoo A0 S lt T type A A0 trait Foo S lt T extends GenFoo S A S 我不明白为什么 类型参数
  • F# 中的数组初始化

    如何根据给定的记录类型在 F 中创建和初始化数组 假设我想创建一个包含 100 个 record1 记录的数组 e g type record1 value1 string value2 string let myArray Array i
  • 如何将类型设置为 vue slot props Typescript

    我正在尝试在插槽道具上设置类型以在表格组件中进行处理 如图所示 我也一直在尝试 body item UserItem 但这只是重命名参数 body
  • 将 F# 类型保存到数据库

    A lot http gorodinski com blog 2013 02 17 domain driven design with fsharp and eventstore f 文章数推荐 http fsharpforfunandpr
  • 检查一个数字是 int 还是 float

    在perl中 我想检查给定变量是否包含浮点数 为了检查我正在使用的 my Var 0 02 Floating point number if int Var Var floating point number 但上面的代码对于 0 0 不起
  • F# 命名约定

    F 是否有 官方 命名 大小写约定 我总是怀疑是否使用 C 风格 Class MyFunctionName or Module my function name 在 F 中 您应该混合 BCL 类和 F 库类 它们具有不同的大小写 并且代码
  • 在FLUTTER/DART中,为什么我们有时在声明变量时要在“String”后面加一个问号?

    在演示应用程序中 我们找到一个实例 最终字符串 标题 gt 为什么要加这个 在 String 类型之后 class MyHomePage extends StatefulWidget MyHomePage Key key this titl
  • 何时评估 F# 函数调用;懒惰地还是立即地?

    F 中的柯里化函数 我知道传入参数子集会产生一个带有预设的函数 我只是想知道传递所有参数是否有什么不同 例如 let addTwo x y x y let incr a addTwo 1 let added addTwo 2 2 incr是
  • C++0x:使用函数迭代元组

    我有一个名为 push它可以处理不同的参数 包括元组 并且应该返回推送元素的数量 例如 push 5 应该将 5 压入堆栈 lua栈 http www lua org manual 5 1 manual html lua pushinteg

随机推荐

  • 使用子查询更新

    我的查询有问题 我有一张巨大的桌子 上面有来自德国的邮政编码 名为 Postleitzahlen 还有另一张名为 Firmen 的公司表 结构是这样的 Firmen ID City State ZipCode Postleitzahlen
  • Tensorflow:在单次运行中分配多个变量值,无需重新计算其他表达式

    我是 Tensorflow 的新手 很抱歉 因为这似乎是一个非常基本的问题 但不幸的是我在 Google 上找不到任何内容 也许我使用了错误的关键字 我有一些从占位符派生的表达式 据我了解张量流的逻辑 以及一些需要在不重新计算 占位符 表达
  • RecyclerView 中的 NullPointEreException

    我尝试从 AsyncTask 中的服务器下载列表并将其放入 recyclerView 中 但是 我仍然在 RecyclerView 上收到 NullPointException 并且不知道为什么 我设置了 LayoutManager 和其他
  • 根据相似度对图像进行聚类

    我面临着基于相似性的图像聚类问题 而不知道聚类的数量 理想情况下 我想实现类似这样的目标http cs231n github io assets cnnvis tsne jpeg http cs231n github io assets c
  • 无法解析相应的jni函数

    我正在制作一个通过串口发送数据的应用程序 这需要从本机库调用方法 我有两个本机方法 打开 关闭 我使用 ndk 生成了 so 库并将它们放入 jnilibs 文件夹中 但仍然给出错误 无法解析相应的 jni 函数 串口 c include
  • 如何使这种组合/排列方法递归?

    我有一个字符串数组列表 希望将所有可能的组合存储到另一个集合中 例如 air bus car gt air bus car air bus air car bus air bus car car air car bus air bus ca
  • 如何监视另一个应用程序的数据库的更改?

    我想监视另一个应用程序 SQLite 数据库的更改 由于 Android 不允许我访问其他应用程序的内部数据 因此我需要一个根应用程序 这正是我的应用程序 有没有办法可以监视系统上文件的更改并在我的应用程序中触发事件 我用谷歌搜索了一下 看
  • jQuery 颜色选择器推荐 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我需要非常轻的 jquery 颜色选择器插件 它允许用户将鼠标拖动到色轮上 并能够选择透明颜色 或 空白 无 有什么建议么 我从谷歌得到了
  • 如何简洁地编写包含数据框中许多变量的公式?

    假设我有一个响应变量和一个包含三个协变量的数据 作为玩具示例 y c 1 4 6 d data frame x1 c 4 1 3 x2 c 3 9 8 x3 c 4 4 2 我想对数据进行线性回归 fit lm y d x1 d x2 d
  • 如何在当前机器上运行jvm

    想象一下 两个 java 项目在 JDK1 5 和 JDK1 6 上运行 其中两个是在 JDK 1 7 上工作的 如何获取正在运行的jvm名称 pid和项目名称就可以了 结果应该是这样的 pid 1234 projec tname prj1
  • iOS:失去蓝牙连接

    我成功地使用蓝牙连接了 iPhone 和 Mac iPhone 是中心 Mac 是外围 连接后 两者可以通信 iPhone 订阅了 Mac 宣传的一些特性 但是 一段时间 随机 之后 iPhone 的蓝牙图标变灰 并且 iPhone 不再接
  • 调用未定义的方法 Illuminate\Foundation\Application::bindShared()

    我刚刚将 Laravel 从 5 0 升级到 5 1 我收到此错误 Call to undefined method Illuminate Foundation Application bindShared 因此 经过一番搜索后 我需要将b
  • 内置变量中的可变默认参数

    我们都知道 可怕的可变默认参数 https stackoverflow com questions 1132941 least astonishment and the mutable default argument 我惊讶地发现至少有一
  • 使用非 SQL 数据库是否就无需防范“SQL 注入”?

    这似乎是一个显而易见 或不那么明显 的问题 但让我解释一下 我正在使用 Google 的数据库技术 BigTable 编写 Google App Engine 网站 任何 App Engine 程序员都会知道 Google 有自己的有限查询
  • 在 Git Web hook 之后重新启动 Plesk 17.5 上的 Node 应用程序

    目前 我在 Plesk 17 5 中的一个非常基本的 NodeJS 服务器上设置了自动 Git 部署 问题是 如果我推送新的提交 我需要手动登录 Plesk 仪表板并单击 重新启动应用程序 否则更改不会生效 我尝试添加npm start作为
  • 关于在画布上显示照片是否存在已知的 Win32 Tkinter 错误?

    我注意到 tkinter 有一个非常奇怪的错误 我想知道这是否是因为 python 与 tcl 交互的方式有问题 至少在 Win32 中是这样 这里我有一个超级简单的程序 可以显示 gif 图像 它工作完美 from Tkinter imp
  • 如何将优先级升级到log4j-2?

    我正在尝试将 log4j 升级到 log4j2 我尝试升级的特定代码行是 log targetClass Priority DEBUG INT message null 静态场Priority DEBUG INT在新版本中不再可用Prior
  • NoSuchMethodError:在 null 上调用了方法“ancestorStateOfType”

    我正在像这样的 iam 流列表那样进行屏幕更改 当它发出时我会更改屏幕 override void initState super initState appBloc error listen data scaffoldKey curren
  • 我可以将资产文件夹中的文件移动到资产子文件夹中吗?

    我的资产文件夹中有一个文件 当我按下程序中的按钮时 我必须将该文件移动到子文件夹 运行时 中 能做到吗 我必须这样做 资产 文件 txt gt 资产 aaa 文件 txt 不会 您的资源会被编译到您的 apk 文件中 考虑存储一个持久的首选
  • F# 元组类型的模式匹配

    我有一个柯里化函数 我希望它支持不同类型的参数 这些参数不具有继承关系 type MyType1 A B of float type MyType2 C D of int 我试图做的是 let func x y match x y with