Types 当参数';s类型是联合类型

Types 当参数';s类型是联合类型,types,racket,typed-racket,Types,Racket,Typed Racket,为我的技术词汇缺少的混乱标题道歉,我不知道该如何表达。我如何在不知道的情况下,将Racket中的某个论点识别为某一类型 类型的构造函数(用于匹配) 一个函数类型?(例如整数?),用于检查它是否是指定的类型 具体来说,假设我有一个类型为的函数(:fn:(All(abc)(a->c)(b->c)(Listof(uab))->Listof c));我们可以想象它被称为(fn fa fb xs)。我希望此函数将xs转换为列表中的c;如果x类型为a,则应将x的x元素映射到(fax),如果x类型为b,则

为我的技术词汇缺少的混乱标题道歉,我不知道该如何表达。我如何在不知道的情况下,将Racket中的某个论点识别为某一类型

  • 类型的构造函数(用于
    匹配
  • 一个函数
    类型?
    (例如
    整数?
    ),用于检查它是否是指定的类型
具体来说,假设我有一个类型为
的函数(:fn:(All(abc)(a->c)(b->c)(Listof(uab))->Listof c))
;我们可以想象它被称为
(fn fa fb xs)
。我希望此函数将
xs
转换为
列表中的c
;如果
x
类型为
a
,则应将
x
x
元素映射到
(fax)
,如果
x
类型为
b
,则应将
(fb x)
元素映射到
。例如,我们可以获取字符串和实数的列表,并将字符串映射到它们的长度,将实数映射到最近的整数

在我知道
a
String
b
Real
的特定情况下,我可以编写如下代码

(define (fn fa fb xs)
    (map (lambda (x) (if (string? x) (fa x) (fb x))) xs))
但只有当我有一个已知的函数
string?
来检查
x
的类型时,这才有效

可以按照我在Racket中的建议做吗?

在类型化Racket中没有“类型”操作,因此答案是否定的。但是,您可以将“决策器”传递给
fn
,以选择应用于每个元素的函数

允许您为指定命题,以便编写以下代码:

#lang typed/racket

(: fn (All (a b c)
           ((U a b) -> Boolean : a)
           (a -> c)
           (b -> c)
           (Listof (U a b))
           ->
           (Listof c)))
(define (fn decider fa fb xs)
  (map (lambda ([x : (U a b)])
         (if (decider x) (fa x) (fb x)))
       xs))
然后您可以调用它:

(fn string? string-length add1 (list 1 "a" 23 "bc"))

;; '(2 1 24 2)
感谢萨姆·托宾·霍克施塔特的帮助