Any) (-6ren">
gpt4 book ai didi

types - 如何在类型 Racket 中创建 "probability"HOF(或语法)

转载 作者:行者123 更新时间:2023-12-01 11:39:44 27 4
gpt4 key购买 nike

我正在尝试在打字 Racket 中创建一个 HOF,这将使我能够表达想法,“在评估时,掷骰子并选择要应用的程序”。

目前,我正在处理以下内容:

(: odds-on ((Any * -> Any) (Any * -> Any) Real -> (Any * -> Any)))
(define (odds-on choice alternative odds)
(cond [(< (random) odds) choice]
[else alternative]))

我的想法是我可以这样使用它:

> ((odds-on do-a-common-thing do-a-rarer-thing .75) 'x '(a b c) (set z))

其中 do-a-common-thingdo-a-rarer-thing 是在别处定义的,并且可能具有任意参数数量和类型。因此,大约 3/4 的时间会调用第一个函数,而 1/4 的时间会调用第二个函数。

但我左右都遇到了类型检查和数量问题……根据文档,我需要 heterogenous rest arguments ,但我不太了解文档,不是类型系统的学者......我只是想能够指定两个函数和一个概率,并在运行时确定调用的函数!

而且,总的来说,也许宏/语法形式是创建这种效果的更明智的方式?从接口(interface)设计的角度来看,这种能力正是我的程序所需要的,但我不知道如何用静态类型来实现它……但我希望静态类型有助于控制程序的其他部分.

最佳答案

让我为您的示例提出一个更简单(在某些方面)的类型:

(: odds-on (All (X Y) (X Y Real -> (U X Y))))
(define (odds-on choice alternative odds)
(cond [(< (random) odds) choice]
[else alternative]))

并像这样使用它:

-> ((odds-on (lambda () (displayln "hi"))
(lambda () (displayln "bye"))
0.75))
bye
-> ((odds-on (lambda ([x : String]) (string-append x "1"))
(lambda ([x : String]) (string-append x "2"))
0.23)
"test")
- : String
"test2"

虽然这里有一点折衷,因为现在您可以传递 odds-on 实际上不是函数的东西。如果您碰巧传递了 odds-on 一些非函数值,您将无法调用返回值(即,类型检查器无论如何都会稍后捕获它)。

(注意:顺便说一句,如果 Typed Racket 支持 bounded polymorphism,您将能够表达一个约束,即 XY 必须是此示例中的函数。这可能是 TR future 的工作。)

还有返回类型中的 (U X Y) 是你必须要小心的。如果您将 odds-on 传递给参数参数不兼容的两个函数,调用结果函数将更加困难。

-> ((odds-on (lambda () (displayln "hi"))
(lambda (x) (displayln "bye"))
0.75))
; readline-input:10:0: Type Checker: could not apply function;
; wrong number of arguments provided
; expected: 1
; given: 0
; in: ((odds-on (lambda () (displayln "hi")) (lambda (x) (displayln "bye"))
; 0.75))
; [,bt for context]

(注意:您的错误消息可能看起来不同。我正在运行 Racket v6.0.0.4。此外,此错误消息不是很好。)

关于types - 如何在类型 Racket 中创建 "probability"HOF(或语法),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22570185/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com