首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如果最里面的函数是泛型的,你能写一个正确推断类型的‘Compose`方法吗

可以的,对于这个问题,我可以给出如下的完善且全面的答案:

在编程中,如果最里面的函数是泛型的,并且我们需要写一个正确推断类型的Compose方法,我们可以使用以下方式实现:

代码语言:txt
复制
function Compose<T>(f: (arg: T) => T, g: (arg: T) => T): (arg: T) => T {
  return (arg: T) => f(g(arg));
}

上述代码中,Compose方法接受两个函数参数fg,这两个函数都需要接受泛型参数arg并返回泛型类型TCompose方法本身也是一个函数,接受泛型参数arg并返回泛型类型T。在内部实现中,我们将g函数应用到arg上,然后再将结果应用到f函数上,最终返回f(g(arg))的结果。

通过这样的实现,我们可以正确推断出Compose方法中的泛型类型,并在使用时传入具体的类型。这样,我们可以实现泛型函数的组合,并保持类型的一致性。

关于泛型函数和类型推断的更多信息,你可以参考以下腾讯云相关产品和产品介绍链接地址:

希望以上信息对你有所帮助。如果还有其他问题,欢迎继续提问。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

通配符上下限与方法

因为ObjectBook父类,如果参数List,那么就无法使用Book方法了,所以只能当成Object来操作。 方法 方法?前面不是讲了么?...因为一个参数,参数就有作用域,定义在类上面的作用域整个类,定义在方法,作用域整个方法。 ?...这里最好将方法再多定义一个参数,保证不会出现歧义,这样程序才能正确进行类型推断。...这样就可以避免歧义,正确推断类型了。 通配符和方法 希望讲到这里还没有晕。 那么我们继续看下一个问题。前面说通配符?...可以代替任何一个类型,T这种形式类型参数不是也可以代替任何一个类型?他们有什么区别呢? 其实方法方法中使用通配符在某些情况下可以相互替代。 ?

88152

Scala类型推导Scala类型推导

根据Picrce说法:“类型系统一个可以根据代码段计算出来值对它们进行分类,然后通过语法手段来自动检测程序错误系统。” 类型可以让表示函数域和值域。...例如,在数学,我们经常看到下面的函数: f: R -> N 这个定义告诉我们函数”f”作用是把实数集数映射到自然集。 抽象地说,这才是具体意义上类型。...换句话说,如果一个值(在运行期)不能够满足程序限制条件的话,那么在编译期就会出错。 通常来说,类型检测器(typechecker)只能够保证不正确程序不能通过编译。...函数式语言比较经典类型推导方法 Hindlry-Milner,并且它是在ML里首先使用。 Scala类型推导有一点点不同,不过思想上一致:推导所有的约束条件,然后统一到一个类型上。... 子类关系真正意思:对于一个给定类型T,如果T’子类,那么T’可以代替T

2.6K20
  • 系统学习Lambda表达式

    答案“不是的”,Lambda表达式对接口有一定要求,必须函数式接口。 所谓函数式接口指的是只定义一个抽象方法接口。...下面用函数描述符来表示上述三个方法签名,箭头前面方法入参类型,后面返回类型。...比如这里因为将Lambda表达式赋值给一个Predicate类型变量,又因为函数描述符为(T) -> boolean,则可推断出参数T实际类型为String。...可能会好奇Comparator 作为一个接口,reversed 方法可以有具体实现,接口实例方法应该都是抽象方法,那它还是一个有效函数式接口,或者说还是一个有效接口?...回想下第二节内容,函数式接口只定义一个抽象方法接口。Comparator抽象方法只有一个 compare,其他具体方法,所以是合法函数式接口。那么接口中为什么能定义具体方法呢?

    60120

    Unit 为啥还能当函数参数?面向实用 Kotlin Unit 详解

    return Unit } 这两个 Unit 不一样,上面的 Unit 这个类型,下面的 Unit 这个单例对象,它俩长得一样但是不同东西。...比如在 Java 里面,由于 void 并不是一种真正类型,所以任何有返回值方法在子类重写方法也都必须有返回值,而不能写成 void,不管你用不用都是一样: public abstract...make() { world.refresh(); return null; } } 而且如果,可能还需要用一个专门虚假类型来让效果达到完美: public class...一个函数函数类型参数,在函数调用时候填入实参,只要符合声明里面的返回值类型,它是可以有返回值,也可以没有返回值: fun runTask(task: () -> Any) { when (...了解各种魔法背后实质,对于我们掌握和正确地使用一门语言很有必要。 延伸:当做纯粹单例对象来使用 比如,知道 Unit 是什么之后,就能理解为什么它能作为函数参数去被使用。

    66221

    这玩意真的有用?对,是的!Kotlin Nothing 详解

    实际上 Java 和 Kotlin 任何方法或者说函数,在抛异常时候都是不返回值——都抛异常还返回啥呀返回?吧?...这是一种很常用工具函数写法,包括 Kotlin 和 Compose 官方源码也有这种东西。 那么我们继续来看它返回值类型:我都不返回了,就没必要还写 String 了吧?那写什么?...作用二:作为对象临时空白填充 另外 Nothing 除了「没有可用实例」之外,还有个特性:它是所有类型共同类型。...但是我如果不直接用 Nothing,而是把它作为类型实例化参数: val emptyList: List = ???...,利用 Nothing 可以创建出一个通用「空白」对象,它什么实质内容也没有,什么实质工作也做不了,但可以用来作为变量一个通用空白占位值。

    31430

    RustGenerics

    如果没有,虽然它们逻辑一致,但是需要为不同类型编写不同函数,而帮助我们只需要编写一个函数,实现通用逻辑即可。例如: fn main() { println!...一个非常强大工具,但是如何合理使用它才是问题。在C/C++和Rust,掌握对于程序员而言比较困难一点。...fn add>(a:T, b:T) -> T 这个add函数定义可以这样理解,函数名后面的T类型,我们在后面的函数参数以及返回值使用了该类型...枚举中使用 在Rust中,枚举中很典型有Option和Results。Option这个枚举类型用来判断一个数据有值;而Results则是用来判断值是否正确。...需要注意,swap函数写法,因为X, Y这两个类型不属于Point方法实现,因此不能写在impl后面,而是需要写在swap后面。

    75620

    我 JS 写好好,为什么要用那么复杂TS

    为什么我写了返回类型,VSCode还是提示返回值any类型好复杂,什么时候要用?接口类型定义要写在哪? 来,我们掰开揉碎一点点讲。 TS谁写给谁看/用?..., 会很清晰通过VSCode提示了解到该函数参数和返回值信息: image.png 而不需要去看源码,要知道,一些复杂方法如果没有良好注释,看源码都不一定能很快判断出来参数和返回值类型...可以通过VSCode提示检测是否正确推断类型。 说极端一点,TS就是为了让使用者爽,有更好提示和约束,让知道是否有正确安全使用提供方法。而不是为了增加你工作量和心智负担。...VSCode没有正确提示 如果项目路径设置了别名alias,那么有可能出现引入方法没有正确提示情况。...什么时候用 要知道这个问题之前,首先要知道什么解决了什么问题。可以先看看文档[2]。 在了解了一个组件支持多种类型之后。如果还不知道什么时候用,那就是还不需要用。

    1.1K10

    写给前端新人 - 我 JS 写好好,为什么要用那么复杂TS

    为什么我写了返回类型,VSCode还是提示返回值any类型好复杂,什么时候要用?接口类型定义要写在哪? 来,我们掰开揉碎一点点讲。 TS谁写给谁看/用?...可以通过VSCode提示检测是否正确推断类型。 说极端一点,TS就是为了让使用者爽,有更好提示和约束,让知道是否有正确安全使用提供方法。而不是为了增加你工作量和心智负担。...VSCode没有正确提示 如果项目路径设置了别名alias,那么有可能出现引入方法没有正确提示情况。 ?...什么时候用 要知道这个问题之前,首先要知道什么解决了什么问题。可以先看看文档。 在了解了一个组件支持多种类型之后。如果还不知道什么时候用,那就是还不需要用。...比如你定义了一个方法: function foo (arg:number):number { return arg } 复制代码 当你需要让这个方法支持string类型时候,不使用的话

    82320

    Swift 进阶:

    唯一区别是它们接收值类型不同( Int 、String 和Double )。 写一个可以交换任意类型函数会更实用、更灵活。代码让你能写出这样函数。(下文中定义了这些函数版本。)...这里写出了一个叫做findIndex(of:in:) 函数,可能期望findIndex(ofString:in:) 函数一个版本。注意,函数返回值仍然 Int?...尤其它必须保证只有正确类型元素才能添加到容器中,而且该类型下标返回元素类型必须正确。...带有 Where 分句扩展 ---- 同时也可以使用where 分句来作为扩展一部分。下面的Stack 结构体扩展了先前栗子,添加了一个isTop(_:) 方法。...如果不想使用上下文where 分句,就需要写两个扩展,每一个都使用范where 分句。下面的例子和上面的例子有着相同效果。

    1.7K20

    Kotlin变之路

    super 子类型>来实现。实例化时可确定为「子类型未知类型」,所以「只能写不能读」。 ❝不能读指的是不能读取为指定类型,而不是不能调用读方法。 ❞ 例如下面的代码。 List可以使支持逆变,但是「只能写不能读」,这里读,指的是不能按照类型读,但如果按照Object读出来再强转具体类型,则是可以。...类型,我们也可以在运行时获取类型,这个方法Java和Kotlin都支持,这个在前面的文章中也提到了。...这个方式一个很巧妙获取类型方法,在Gson中,就是通过它来获取类型。...❝要注意,这里能保留申明处如果调用处,例如方法传参,这种就不会被保存了。

    1.2K21

    约束即类型、TypeScript 编程内参(一)

    今年开始火了,越来越多 js 项目开始用 ts 来实现,因此有了一句广为流传名言(捏他) 任何用 js 写项目终将用 ts 重构 那么,了解 ts ?...,比如我想实现一个数学上函数 x => x,ts 实现如下(需要用到): ?...常函数 x => x 这里 ts 声明描述了: 这里 T 单独尖括号标出意思告诉 ts,接下来 T 函数入参 x 和函数返回值类型 T 当具体 ts 去推断 val 类型时候,就可以发现...无处不在,它是类型拓展,我们一般利用去定义 可拓展数据结构/接口/类型, 如 js 一些原生类里面就有影子: // 求和 arr 并结果将其以 promise 形式包裹返回 function...宽泛,而不是范式范。

    91710

    TypeScript 4.3 新功能实践应用

    也许这依然有些模糊,但如果如果我换个说法,或许就明白了:给你一颗二叉树,问题从根节点出发,所有可能路径。 但是这些和 Template Literal Types 有什么关系?!...在具体详解函数之前,本节想要先介绍一些可能不了解 TS 高级特性,如果非常有自信,可以略过此节,直接去看后面的函数如果发现看不懂,回头再看此节也不迟。...可能不了解 TS 类型系统 我们知道 TS 核心功能就是一套静态类型系统,但真的懂 TS 类型系统?让我问你一个问题测试一下:TS 类型集合?...这是一个非常有趣问题,正确答案:编程语言中类型,除了一个特例之外,确实都是值集合。但因为特例存在,我们就不能将编程语言中类型视为值集合。...具体表现可以直接看下面的图示: ? 3. Inferring Within Conditional Types 关于条件类型还有一个不可缺失高阶特性:infer 推断

    1.1K30

    关于TypeScript中,希望这次能让彻底理解

    在编程世界,我们经常会遇到一个情况:阅读那些充满了虚构示例枯燥文档,实在让人提不起兴趣。因此,在这篇文章中,我想和大家分享一些我在实际开发过程中遇到(Generics)使用案例。...通常情况下,如果没有(Generics),我们可能需要为每种资源分别定义一个响应类型。 举个例子,服务器需要返回用户信息和书籍信息。...这样一来,如果尝试传递一个正确字段或者错误类型值给 setUserField 函数,TypeScript编译器会提供类型错误提示,从而减少运行时错误可能性。...target); } 如果初学者,可能会这样使用它: identifyType(5); 但是,TypeScript可以从作为第一个参数传递值中推断类型,最好这样使用:...如果一位经验丰富开发者,代码将看起来像这样: const [count, setCount] = useState(5); 还有我遇到过一个情况,有开发者害怕在React组件props中使用

    16210

    30分钟教程

    (2): 假设一个方法设计者, 这个方法需要有一个输入参数,但并能确定这个输入参数类型 那么会怎么做呢?...如果这个方法处理逻辑不适用于字符串参数 而使用者又传了一个字符串进来 编译器不会报错, 只有在运行期才会报错 (如果质管部门没有测出这个运行期BUG,那么不知道要造成多大损失呢) 这就是我们常说...注意: 如果一个方法指定了两个参数,而且这两个参数类型都是T, 那么如果你想使用类型推断必须传递两个相同类型参数给这个方法 不能一个参数用string类型,另一个用object类型,这会导致编译错误...,如果这个方法指定了约束 在重写这个方法时,不能再指定约束了 注意3: 虽然我上面的例子写接口约束,但完全可以写一个类型,比如说BaseClass 而且,只要是继承自BaseClass类型都可以当作...如果对T进行了new约束:where T : new();  那么new T()就是正确,因为new约束要求T类型一个公共无参构造器。

    71860

    2022年03月22日 Go生态洞察:介绍

    2022年03月22日 Go生态洞察:介绍 摘要 作为猫头虎博主,今天来聊聊Go语言一个重大更新——!在这篇文章,我将深入探讨Go 1.18中引入功能。...如果对Go新特性感兴趣,别错过这次深入洞察! 引言 Go 1.18发布带来了对支持,这是自Go首次开源发布以来最大变化。让代码能够独立于正在使用特定类型。...例如,interface{ int|string|bool }定义了包含int、string和bool类型类型集。 类型推断 类型推断复杂语言变化之一。...实践中类型推断 虽然类型推断细节复杂,但使用起来非常直接:类型推断要么成功,要么失败。如果成功,就可以省略类型参数,调用函数就像调用普通函数一样。...引入让Go程序员工作变得更高效。 特性 描述 类型参数 允许函数类型具有类型参数 类型集 接口定义为类型集,包括无方法类型 类型推断 在许多情况下允许省略类型参数

    15510

    java8 函数式接口详解 函数接口详解 lambda表达式 匿名函数 方法引用使用含义 函数式接口实例 如何定义函数式接口

    test抽象方法,它接受T对象,并返回一个boolean。...java.util.function.Function 函数 有输入有输出 数据转换功能 接口定义了一个叫作apply方法,它接受一个T对象,并返回一个R...为什么要有基本类型扩展 只有对象类型才能作为参数,对于基本类型就涉及到装箱拆箱操作,虽然自动 但是这不可避免给内存带来了额外开销,装箱和拆箱都会带来开销 所以为了减小这些性能开销  ...ArrayList(); 这就是类型推断  ,一个直接直观好处就是可以简化代码书写,这不就是语法糖么 针对 Lambda表达式也有类型推断 Java编译器可以根据  上下文(目标类型)...函数式接口定义了函数类型   有了类型就如同其他类型 比如 int 一样   可以定义变量 可以传递参数 可以返回 一个函数方法方法签名和方法体两部分内容组成 函数接口只是有了方法签名

    1.8K30

    进阶实现智能类型推导简化版Vuex,手把手带你实现。

    通过这篇文章,可以学到以下特性在实战中如何使用: ?TypeScript高级类型(Advanced Type) ?TypeScript中利用进行反向类型推导。(Generics) ?...此时ADD函数形参state就有了类型推断,它就是我们传入state类型。 ?...现在有个问题,我们现在写法没有任何地方能体现出payload类型,(这也是Vuex设计所带来一些缺陷)所以我们也只能写成any,但是我们本文目标类型安全。...Ts推断方法,这个方法原封不动返回dispatch函数,但是用了as关键字改写它类型,我们需要把ActionTypes作为传入: export default class Vuex...,直接把A交给第一个形参action就好了,由于ActionTypes联合类型,Ts会严格限制我们填写action类型必须AddType或者ChatType中一种,并且填写了AddType

    76351

    进阶实现智能类型推导简化版Vuex,手把手带你实现。

    通过这篇文章,可以学到以下特性在实战中如何使用: ?TypeScript高级类型(Advanced Type) ?TypeScript中利用进行反向类型推导。(Generics) ?...此时ADD函数形参state就有了类型推断,它就是我们传入state类型。...现在有个问题,我们现在写法没有任何地方能体现出payload类型,(这也是Vuex设计所带来一些缺陷)所以我们也只能写成any,但是我们本文目标类型安全。...Ts推断方法,这个方法原封不动返回dispatch函数,但是用了as关键字改写它类型,我们需要把ActionTypes作为传入: export default class Vuex...,直接把A交给第一个形参action就好了,由于ActionTypes联合类型,Ts会严格限制我们填写action类型必须AddType或者ChatType中一种,并且填写了AddType

    82810

    进阶实现智能类型推导简化版Vuex,手把手带你实现。

    通过这篇文章,可以学到以下特性在实战中如何使用: TypeScript高级类型(Advanced Type) TypeScript中利用进行反向类型推导。...一个很重要使用) 希望通过这篇文章,可以对TypeScript高级类型实战应用得心应手,对于未来想学习Vue3源码小伙伴来说,类型推断和infer用法也是必须熟悉。...此时ADD函数形参state就有了类型推断,它就是我们传入state类型。...现在有个问题,我们现在写法没有任何地方能体现出payload类型,(这也是Vuex设计所带来一些缺陷)所以我们也只能写成any,但是我们本文目标类型安全。...Ts推断方法,这个方法原封不动返回dispatch函数,但是用了as关键字改写它类型,我们需要把ActionTypes作为传入: export default class Vuex

    17610
    领券