You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Typed Racket中定义匹配任意函数的类型注解

在Typed Racket中定义通用函数类型

问题原因

你之前尝试的两种类型都有局限性:

  • (All (A B) (-> A B)) 是单参数多态函数类型,只能匹配接受单个参数、返回单个值的函数,无法覆盖无参数或多参数的情况;
  • (-> Any Any) 是单参数、参数和返回值均为Any的函数类型,同样只能匹配单参数函数,多参数函数会触发类型不匹配错误。

解决方案

Typed Racket提供两种方式定义能匹配所有函数的通用类型:

1. 多态可变参数类型(推荐,保留类型推断能力)

使用All结合可变参数语法,泛化参数数量、参数类型和返回值类型:

(All (Result Args ...) (->* Args ... Result))

这个类型表示:接受任意数量(包括0个)的参数(类型为Args),返回任意类型Result的函数,能覆盖所有函数场景。

示例用法(绑定到结构体属性):

#lang typed/racket

(struct FuncHolder ([func : (All (Result Args ...) (->* Args ... Result))])
  #:type-name FuncHolder)

; 测试不同类型的函数都能正常绑定
(define holder1 (FuncHolder (λ () "无参数函数")))
(define holder2 (FuncHolder (λ (a b) (+ a b)))) ; 双参数数值函数
(define holder3 (FuncHolder (λ (x y z) (list x y z)))) ; 三参数列表返回函数

2. 预定义的Procedure类型(简单直接,类型推断弱)

Typed Racket内置了Procedure类型,它是所有函数类型的超类型,可以直接用来匹配任意函数:

Procedure

示例用法:

#lang typed/racket

(struct SimpleFuncHolder ([func : Procedure])
  #:type-name SimpleFuncHolder)

(define s-holder1 (SimpleFuncHolder (λ () 42)))
(define s-holder2 (SimpleFuncHolder (λ (str) (string-upcase str))))

注意:使用Procedure类型时,调用该函数时Typed Racket无法自动推断参数和返回值类型,若需要类型安全的调用,需用cast或ann显式指定类型。

问题解答总结

  • 是否需要使用All?如果想要保留后续的类型推断能力,推荐使用带All的多态可变参数类型;若追求简单,直接用Procedure即可。
  • 是否存在匹配所有函数的类型?是的,Procedure和上述多态可变参数类型都可以匹配任意函数。

内容的提问来源于stack exchange,提问作者NPN328

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:01:31