将常规 Swift 函数转换为 Curry 函数

2024-03-23

我正在尝试将常规函数转换为咖喱函数,但得到Execution was interrupted

下面是我柯里化一个函数并执行 unsafeBitCast 来调用带有一个参数的函数并稍后使用第二个参数调用它的代码。

func curry<T>(f: (T, T) -> T) -> T -> T -> T {
    return { a in
        typealias Function = (T) -> (T -> T)
        let fn = unsafeBitCast(f, Function.self)
        return curry(fn(a))
    }
}

func curry<T>(f: T -> T) -> T -> T {
    return { f($0) } // Throws Runtime Exception
}

func adder(x: Int, y: Int) -> Int {
    return x + y
}

let adderCurry = curry(adder)
let add1 = adderCurry(1)
add1(2)

有谁知道如何将具有两个或多个参数的常规函数​​转换为柯里函数

func add(x: Int)(y: Int) -> Int {
  return x + y
}

编辑:这个例子也不起作用

func curry<T>(f: (T, T) -> T) -> T -> T -> T {
    typealias Function = T -> T -> T
    return unsafeBitCast(f, Function.self)
}

func adder(x: Int, y: Int) -> Int {
    return x + y
}

let adderCurry = curry(adder)
let add1 = adderCurry(1)
add1(2)

您不需要对其进行类型转换,而是返回依次捕获每个参数的嵌套闭包:

func add(x: Int, y: Int) -> Int {
    return x + y
}

func curry<T1, T2, T3>(f: (T1, T2) -> T3) -> T1 -> T2 -> T3 {
    return {
        (t1: T1) -> T2 -> T3 in

        return {
            (t2: T2) -> T3 in

            return f(t1, t2)
        }
    }
}

let curriedAdd = curry(add)
let add3 = curriedAdd(3)
println(add3(5))
// 8

这更简洁:

func curry<T1, T2, T3>(f: (T1, T2) -> T3) -> T1 -> T2 -> T3 {
    return { t1 in { t2 in f(t1, t2) } }
}

我认为写一个咖喱机会很有趣;就是这样 - 如果有人知道如何制作其中一个来生成实际的函数,那将是令人惊奇的:

func curryRecipe(n: Int) -> String {
    let types = join(", ", map(1...n, { "T\($0)" }))
    let returnType = join(" -> ", map(1...n, { "T\($0)" }))
    let closures = join(" in ", map(1...n, { "{ t\($0)" }))
    let braces = join(" ", Array(count: n, repeatedValue: "}"))
    return "func curry<\(types), R>(f: (\(types)) -> R) -> \(returnType) -> R {\r" +
        "    return \(closures) in f(\(types.lowercaseString)) \(braces)\r}"
}

println(curryRecipe(15))

Output:

func curry<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, R>(f: (T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15) -> R) -> T1 -> T2 -> T3 -> T4 -> T5 -> T6 -> T7 -> T8 -> T9 -> T10 -> T11 -> T12 -> T13 -> T14 -> T15 -> R {
    return { t1 in { t2 in { t3 in { t4 in { t5 in { t6 in { t7 in { t8 in { t9 in { t10 in { t11 in { t12 in { t13 in { t14 in { t15 in f(t1, t2, t3, t4, t5, t6, t7, t8, t9, t10, t11, t12, t13, t14, t15) } } } } } } } } } } } } } } }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将常规 Swift 函数转换为 Curry 函数 的相关文章

  • Swift 如何格式化带有千位分隔符的大数字?

    有没有一个简单的命令可以将 1 60543e 06 格式化为 1 605 436 resultFV text String localizedStringWithFormat f fv 不明白 在斯威夫特 3 中 NumberFormatt
  • 如何在 Swift 中编写 Cordova 插件?

    我将现有的自定义插件转换为 Swift 语言 位于Plugins CustomPluginInSwift swift import Foundation class CustomPluginInSwift CDVPlugin func ge
  • 为什么使用自动布局时视图的框架宽度始终为 600 x 600

    我正在制作一个基本的扫雷应用程序 用于快速练习 娱乐 我想让板的尺寸 10 个图块宽 适应任何 iOS 屏幕 为此 我通过获取tileContainer view frame width和 10来设置每个图块的大小 我的问题是 tileCo
  • IBDesignable 和 UITableViewCell

    我正在尝试利用 XCode 6 中 Swift 的 IBDesignable 功能来创建 UITableViewCell 的子类 我在 WWDC 演示和网络上看到 您可以使用框架来创建视图 UIView 的子类 然后可以将其用于自定义 UI
  • NSMenuItem with attributeTitle 包含 NSFont 对象,绘制带有基线偏移的标题

    我正在尝试使用系统中可用的字体列表创建一个 NSPopUpButton 看起来很明显的任务 但我失败了 我想 我错过了一些如此明显的事情 以至于我完全忘记了它 代码非常简单 let button NSPopUpButton button m
  • 在选择器视图中为行实现的标题没有改变字体?

    我尝试更改选择器视图中标题的字体 但由于某种原因我不能 我可以更改标题的颜色 但字体保持不变 func pickerView pickerView UIPickerView attributedTitleForRow row Int for
  • 滚动视图下的iOS swift 4 imageview:双击缩小

    我已经应用了图像视图来通过捏合来放大 缩小 那很容易 当在图像视图上应用双击时 无法检测到选择方法 我使用 Xcode 9 和 swift 4 您能告诉我滚动视图是否应该应用双击手势吗 var previewImage UIImage ni
  • iOS Swift 中断键盘事件

    我在拦截键盘事件时遇到问题 我已将我的 iOS 与 SteelSeries Free 游戏手柄控制器 连接 当连接到 iOS 时 它将被检测为蓝牙键盘 这是在我打开Notes时测试的 按下游戏手柄上的任何按钮都会写一个字母 我需要拦截此按钮
  • 快速布尔运算

    这实在令人困惑 有人有什么想法吗 let viewHasMovedToRight false initially I want this to be false then func moveViewToRight sender UIButt
  • Swift 2 OAuth2 LinkedIn 连接

    我将使用 Swift 2 和 Xcode 7 制作一个本机 iOS 应用程序 用户应该使用 LinkedIn 和 OAuth 2 登录 但我想知道应该如何开始设置 我对 OAuth 2 没有太多经验 有好的教程或示例应用程序吗 我看到了雷
  • 由于没有系统应用程序而终止

    这个错误让我发疯 我有一个按钮 我想移动到视图控制器 如果我将其设置为初始视图控制器 我可以打开该视图控制器 但现在我通过单击按钮来调用它 视图控制器包含一个自定义视图 我在绘制矩形上放置了一个断点 当绘制矩形完成时 模拟器终止 我在屏幕上
  • 沙盒测试帐户反复询问 iOS 应用内购买的密码

    我用 Swift 语言开发了一个应用程序 我添加了应用内购买来删除广告 我还创建了一个沙箱帐户来测试 但后来我忘记了这个账户的信息 我不确定信息 密码输入屏幕仍然以闪烁的屏幕显示方式显示 即使我重置设备并重新加载它 也没有任何好处 实际上一
  • 如何快速从解析中加载图像?

    我想知道是否有人可以帮助我 我是应用程序开发的新手 我正在从我的应用程序上传图像以在解析文档的帮助下毫无问题地进行解析 let imageData UIImagePNGRepresentation scaledImage let image
  • 使用 Metal 高效计算 UIImage/CIImage 中有多少透明像素

    我们可以计算有多少个透明像素的最快方法是什么CIImage UIImage 例如 如果我们谈论效率 我的第一个想法是使用Metal Kernel使用任一CIColorKernel左右 但我不明白如何使用它来输出 计数 我还有其他想法 使用某
  • 使用 Swift 创建 NSAlert

    我有在 Objective C 中创建和 NSAlert 的代码 但我现在想在 Swift 中创建它 该警报旨在确认用户想要删除文档 我想要 删除 按钮来运行删除功能 而 取消 按钮只是为了消除警报 我怎样才能用 Swift 写这个 NSA
  • Audiokit 修剪音频

    我正在制作音频编辑应用程序 我想修剪我的音频 对于音频编辑 我使用 AudioKit 框架 但我在教程和示例中找不到如何使用此框架修剪音频 异步导出允许设置开始和结束样本 https github com AudioKit AudioKit
  • Swift - 将图像插入 PDF 不再适用于 iOS 13

    目前正在开发在我的贷款计算器应用程序上导出 PDF 的功能 我有一个预览屏幕 可以在您保存 PDF 之前显示它 预览屏幕由带有 html 的 webView 组成 其中包含占位符 我能够成功地将图像插入到正确的占位符上 并将其显示在 PDF
  • CIAdditionCompositing 给出不正确的效果

    我正在尝试通过平均其他几个图像来创建图像 为了实现这一点 我首先将每个图像变暗 其系数等于我平均的图像数量 func darkenImage by multiplier CGFloat gt CIImage let divImage CII
  • UIApplication.shared.delegate 相当于 SceneDelegate xcode11?

    我在 SceneDelegate 中定义了一个 let 属性 我希望一些 ViewController 能够在场景中访问它 在 UIKit 中 我可以像这样访问 App Delegate 属性 UIApplication shared de
  • 在completionHandlers中存储值 - Swift

    我正在创建一个completionHandler它返回一个字典 但是当我在另一个类中调用这个方法时 它的值是零 func fetchLatestPosts completionHandler responseDict NSDictionar

随机推荐

  • 让屏幕阅读器说出按钮 alt 属性而不是 insideText

    是否可以强制屏幕阅读器读取 alt 属性而不是按钮内的文本 示例 HTML
  • 从 zfs 池中永久删除磁盘

    我尝试通过 ZIL 将 SSD 添加到 zpool 但我犯了一个错误 我期望 zpool 添加区域日志 c0t1d0但我做了 zpool 添加区域 c0t1d0 我尝试执行区域删除 分离 离线命令 但失败了 如何在 zpool 中移除 SS
  • WinForms如何调用按钮上的双击事件?

    我希望事件仅在双击按钮时发生 而不是在单击按钮时发生事件 遗憾的是 双击事件没有出现在 IDE 的事件列表中 有人知道解决这个问题的好方法吗 谢谢你 不 标准按钮不会对双击做出反应 请参阅文档按钮 双击 http msdn microsof
  • 递归到迭代帕斯卡三角形[重复]

    这个问题在这里已经有答案了 我想知道如何将递归函数 类转换为迭代函数 类 我已经制作了递归帕斯卡三角形 现在需要将其与迭代进行比较 public class RecursivePascal extends ErrorPascal imple
  • 是否可以使用 html 按钮为页面添加书签?

    是否可以使用 html 按钮为页面添加书签
  • 如何在不锁定活动方向的情况下锁定片段方向?

    我有一个特定的用例 我希望将片段锁定在纵向模式下 但仍然旋转活动 和 或同一活动中可见的其他片段 可以这样做吗 所有锁定片段方向的解决方案都建议使用 setRequestedOrientation 并锁定活动方向 但我需要其他可见片段进行旋
  • 从 Active Directory C# 检索图片

    我对 LDAP 非常陌生 想知道是否有一种方法可以知道特定域的活动目录中填充了哪些信息 例如 我试图使用以下方法获取组织员工的图像 var bytes directoryEntry Properties thumbnailPhoto Val
  • Ruby on Rails:从 ids 到名称/标题等的 URL

    我创建了生成脚手架的模型对象 但现在我想而不是链接到 controller id objectname 1 到 controller title objectname new blog post 我该如何做到这一点 以便链接能够正确链接到标
  • 如何在 SQL 查询中向 SQL Server 列添加加一 (+1)

    简单的问题是 如何将 MS Query 中的字段值加 1 我正在尝试将 1 1 添加到int使用参数化方法在我的 SQL Server 数据库中创建列 类似于变量上的 i 操作 我正在使用以下方法 public static int Upd
  • 使用文档和元素进行事件触发的区别

    给定这两个关于事件触发器的jquery document on click a data trigger colorbox function e a data trigger colorbox on click function e 当我使
  • 如何在 AutoHotkey 中读取多行用户输入?

    我有一个 AutoHotkey 脚本 需要从用户读取多行员工数据 InputBox userInput Employee Records Please enter employee records One per line Unfortun
  • XSLT 中的序列

    我的 xml 输入是
  • 为 iPod classic 编码视频

    我刚刚安装完ffmpeg在 debian wheezy 上使用这些说明 http trac ffmpeg org wiki UbuntuCompilationGuide http trac ffmpeg org wiki UbuntuCom
  • Lua 中的“加载”有什么作用?

    我试图解决我的理解问题loadLua 脚本中的函数 但没有该命令的任何示例或指南 它在他自己的 Lua 网站上讲述https www lua org manual 5 2 manual html pdf load https www lua
  • 如何在 WPF 中将字符串绑定到 double?

    我想设置一个绑定 问题是目标是 string 类型 但源是 double 类型 在以下代码中 VersionNumber 的类型为 double 当我运行它时 文本块是空的 没有抛出任何异常 我该如何设置这个绑定
  • 使用 cron 防止 Bash 脚本并行或重叠运行

    如果我的 cron 表中有以下条目 00 03 java prog1 sh 00 5 java prog2 sh 第一份工作通常需要 30 分钟左右才能完成 第二项工作大约需要10分钟 在某些特殊情况下 第一份工作需要两个多小时 有没有办法
  • jquery 和 updatepanel?

    我在 ASP NET 中有一个更新面板 可以进行部分页面刷新 我使用 jQuery 取得了一些成功on 方法不过 document ready function 仅在页面初始加载期间调用 而不是在每次 updatepanel 刷新后调用 我
  • 如何在 C++ 调试期间冻结 VSCode 中的线程

    我已经使用 VSCode 进行编码几个月了 真的是太棒了 然而 我发现我无法冻结一个线程 我能做的就是Pause all threads and Continue all threads 如果不冻结特定线程 则很难调试多线程程序 尤其是一些
  • 为什么 v1 Web 组件 customElements.define() 会抛出 TypeError

    我正在使用 v1 Web 组件 根据埃里克 比德尔曼 Eric Bidelman 的说法自定义元素 v1 可重用的 Web 组件 https developers google com web fundamentals primers cu
  • 将常规 Swift 函数转换为 Curry 函数

    我正在尝试将常规函数转换为咖喱函数 但得到Execution was interrupted 下面是我柯里化一个函数并执行 unsafeBitCast 来调用带有一个参数的函数并稍后使用第二个参数调用它的代码 func curry