Types 当参数';s类型是联合类型
为我的技术词汇缺少的混乱标题道歉,我不知道该如何表达。我如何在不知道的情况下,将Racket中的某个论点识别为某一类型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,则
- 类型的构造函数(用于
匹配
)
- 一个函数
(例如类型?
),用于检查它是否是指定的类型整数?
的函数(: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)
感谢萨姆·托宾·霍克施塔特的帮助