Kotlin柯里化——函数调用链

2023-11-10

一、首先看一个小例子,做个铺垫

package net.println.kotlin.chapter5.currying

/**
 * @author:wangdong
 * @description:柯里化——函数调用链
 */

/**定义一个Hello的方法*/
//传入三个参数,返回一个Boolean类型的值
fun hello(x: String,y: Int,z: Double):Boolean{
    return true;
}

/**定义一个柯里化的方法
 * 1.传入一个String类型的参数x
 * 2.返回了一个函数,这个函数又传入了一个Int类型的y
 * 3.又返回了一个函数,这个函数又传入了一个Double类型的z
 * 柯里化就是完成:
 * 有多个参数的函数,变换成一系列单参数的函数的变换
 */
fun curriedHello(x: String):(y: Int) -> (z:Double) -> Boolean{

}

二、柯里化更详细的例子(日志打印)

package net.println.kotlin.chapter5.currying

import java.io.OutputStream

/**
 * @author:wangdong
 * @description:柯里化——函数调用链
 */

/**
 * 写一个打日志的东西
 */
fun log(tag: String,target: OutputStream,message: Any?){
    //打日志"\n"是换行的意思
    target.write("[$tag] $message\n".toByteArray())
}

/**
 * 柯里化它
 * 1.首先传tag
 * 2.返回一个函数,函数再传target
 * 3.返回一个函数,函数再传Any
 */
/*
* 这样写下去就很复杂了
fun log(tag: String): (target: OutputStream) -> (message: Any?){

}*/

/***
 * 用一个简单的写法
 */
/*fun log(tag: String)
    =fun(target: OutputStream)
    =fun(message: Any?)
    = target.write("[$tag] $message\n".toByteArray())*/

fun main(args: Array<String>) {
    log("benny",System.out,"HelloWorld")
    //log("benny")(System.out)("HelloWorld Again")
    ::log.curried()("benny")(System.out)("HelloWorld Again")
}

/**
 * 这个柯里化就非常简单了
 * 写一个扩展函数
 * 三个参数那么就扩展Function3了
 * 这样写就对了,目前请不要过分深究,他日在细细研究
 */
fun <P1,P2,P3,R> Function3<P1,P2,P3,R>.curried()
    =fun (p1: P1) = fun (p2: P2) = fun (p3: P3) = this(p1,p2,p3)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Kotlin柯里化——函数调用链 的相关文章

随机推荐

  • 在 K8S 中快速部署 Redis Cluster & Redisinsight

    Redis Cluster 部署 使用 Bitnami helm chart 在 K8S redis 命名空间中一键部署 Redis cluster helm repo add bitnami https charts bitnami co
  • RS-485详解(一)

    RS 485是美国电子工业协会 EIA 在1983年批准了一个新的平衡传输标准 balanced transmission standard EIA一开始将RS Recommended Standard 做为标准的前缀 不过后来为了便于识别
  • sqli--labs 进阶篇 23_24关

    第二十三关 基于单引号的过滤字符注入 直接爆点 测试是否报错 从下面的提示信息 可以知道是单引号 id 代码审计 进一步确定自己的推论 源码中 存在过滤掉一些注释语句 id 1 推测结构 参数XX limit 0 1 利用回显确定下自己的推
  • 【Linux 速查手册】基于CentOS的Linux 文件结构以及在搭建LAMP环境

    文章目录 LAMP Linux 主要文件结构 Apache 作为 Web 服务器的文件结构 在Centos 中 home目录和 目录的区别 写在最后 LAMP LAMP是指使用 Linux Apache MySql PHP 搭建而成的网站
  • 2018最有前景的编程语言, 你选对了吗?

    对于程序员来说 世间最可怕的事情 莫过于 刚刚学过的编程语言就已经过时 对于求职者来说 了解受欢迎的编程语言及趋势 无论是对找工作 还是规划将来的职业发展 都有很大的好处 基于各种可信来源的数据统计 我对2018年初IT行业编程语言的状态
  • Debian 10驱动Broadcom 无线网卡

    用lspci命令查询无线网卡品牌 运行下面代码后 重启即可 apt get install linux image uname r sed s linux headers uname r sed s broadcom sta dkms
  • QT处理日志文件

    由于实际生产需要 软件系统的运行 会产生大量的日志文件 有时候一天就能产生超过百万条log记录 那么为了能够处理日志文件 查询并且找到我们想要的报错信息 因此不得不考虑怎么实现 打开大日志文件的可行方法 在这里我采用的是内存映射的方式去读取
  • 深入理解神经网络:使用Python实现简单的前馈神经网络

    在本文中 我们将深入理解前馈神经网络的原理 并使用Python编程实现一个简单的前馈神经网络 我们将使用NumPy库来处理矩阵运算 并将逐步解释神经网络的各个组成部分 包括神经元 激活函数 前向传播 反向传播和梯度下降 最后 我们将以一个简
  • k8s-基础入门

    目录 一 k8s的特性 二 kubernetes的基本组件 1 Pod 最小的资源单位 1 1 Pod的两个分类 2 资源清单 3 Pod 控制器 维护Pod状态 期望值 4 服务发现 Service同一个访问入口 5 存储服务分类 6 调
  • linux rpm软件包管理,linux之rpm软件包管理

    1 RPM包的命名规则 例如 httpd 2 2 15 15 el6 centos 1 i686 rpm httpd 软件包名 2 2 15 软件版本 15 发行次数 e16 centos 适合的linux平台 i686 适合的硬件平台 r
  • Angular之ngModel报错:angular-can‘t-bind-to-‘ngModel‘---

    做双向绑定时 如果遇见Angular Can t bind to ngModel since it isn t a known property of input 问题 这是由于没有在当前组件所属的Module中引用FormModule 注
  • 操作系统-进程概念与进程控制块

    进程 在学习操作系统时 对于进程我们经常能看到如下几个定义 一个正在执行的程序 一个正在计算机上执行的程序实例 能分配给处理器并由处理器执行的实体 由一组执行的指令 一个当前状态和一组相关的系统资源表征的活动单元 以上定义都是很抽象的 将进
  • Papers with Code一个查找论文和对应代码的神器

    0x01 Papers with Code是什么 Papers with Code 是一个包含机器学习论文及其代码实现的网站 大多数论文都是有GitHub代码的 这个网站很牛逼的地方就是对机器学习方向做了任务分类 检索对应的论文 数据 代码
  • Shell 编程:探索 Shell 的基本概念与用法

    目录 Shell 简介 Shell 脚本 Shell 脚本运行 Shell 变量 1 创建变量和赋值 2 引用变量 3 修改变量的值 4 只读变量 5 删除变量 6 环境变量 Shell 字符串操作 1 拼接字符串 2 字符串长度 3 字符
  • 实现antd中Form、Form.Item组件

    实现antd中Form Form Item组件 初始化项目 使用create react app初始化项目后创建MyRcFieldForm文件 代码如下 import React Component useEffect from react
  • SWOT分析模型

    SWOT分析模型 出自 MBA智库百科 http wiki mbalib com SWOT分析模型 SWOT Analysis SWOT分析法 也称TOWS分析法 道斯矩阵 即态势分析法 20世纪80年代初由美国旧金山大学的管理学教授韦里克
  • Flask+Nginx+Gunicorn部署应用实现

    实际的开发中 不能使用flask搭建的轻型服务器 无法满足性能要求 在生产环境中可以使用Gunicorn做容器 部署flask程序 Gunicorn 是Python WSGI HTTP 服务器 兼容各种web框架不需要配置 安装后直接使用命
  • Java面向对象编程

    在双向循环链表中 在p指针所指的节点后插入一个指针q所指向的新节点 修改指针的操作是 A p gt next q q gt prior p p gt next gt prior q q gt next q B p gt next q p g
  • tensorflow使用显卡gpu进行训练详细教程

    GPU之nvidia smi命令详解查看显卡的信息 cmd nvidia smi GPU之nvidia smi命令详解 简书 编辑 GPU 本机中的GPU编号 有多块显卡的时候 从0开始编号 图上GPU的编号是 0 Fan 风扇转速 0 1
  • Kotlin柯里化——函数调用链

    一 首先看一个小例子 做个铺垫 package net println kotlin chapter5 currying author wangdong description 柯里化 函数调用链 定义一个Hello的方法 传入三个参数 返