gpt4 book ai didi

racket - 打字 Racket : Creating generic types with define-type

转载 作者:行者123 更新时间:2023-12-01 11:03:34 24 4
gpt4 key购买 nike

我正在尝试对 Typed Racket 有所了解,但是我在让(不可否认相当构建的)实验工作时遇到了一些麻烦。

这是我最初拥有的:

#lang typed/racket

(: generate-list
(All (A)
((A -> A) (Integer -> A) Integer -> (Listof A))))

(define (generate-list function location-function num-items)
(let: loop : (Listof A)
((count : Integer 0)
(result : (Listof A) (list)))
(if (>= count num-items)
(reverse result)
(loop (+ count 1)
(cons (function (location-function count)) result)))))

; ---------------------------------
(: f (Number -> Number))
(define (f x) (* x x))

(: locf (Integer -> Number))
(define (locf x) x)
; ---------------------------------

(displayln (generate-list f locf 10))

其中有输出:
(0 1 4 9 16 25 36 49 64 81)

这很好。然后我想我可以通过给函数和位置函数一个定义的类型来更好地记录它:
#lang typed/racket

(define-type (ListGenFunction A) (A -> A))
(define-type (ListGenLocFunction A) (Integer -> A))

(: generate-list
(All (A)
(ListGenFunction ListGenLocFunction Integer -> (Listof A))))

(define (generate-list function location-function num-items)
(let: loop : (Listof A)
((count : Integer 0)
(result : (Listof A) (list)))
(if (>= count num-items)
(reverse result)
(loop (+ count 1)
(cons (function (location-function count)) result)))))

; ----------- Numbers! ------------
(: f ListGenFunction)
(define (f x) (* x x))

(: locf ListGenLocFunction)
(define (locf x) x)
; ---------------------------------

(displayln (generate-list f locf 10))

现在是问题开始的地方(我真的希望一些有经验的 Typed Racketeers 现在不要太难对付)。一方面,类型检查器在我定义 f 的那一行给了我一个错误。该消息相当冗长,但基本上是:“类型检查器:函数应用程序中没有匹配的函数域:类型:... in:(* x x)”。我以为我定义了一个类型,它有一个返回泛型类型 A 的泛型类型 A 的参数? (* x x) 行不通?或者是否需要“标记”类型? (例如在类似 C++ 的语言中,它是 list )

最重要的是:现在我对函数 generate-list 的类型定义具有“(Listof A)”的返回类型。但是 A 根本没有被声明为与 ListGenFunction 和 ListGenLocFunction 类型的参数期望的相同的 A 。然而,我有点想建立这种联系,以便使用该函数的任何人都可以确保他提供的函数的类型与返回列表项的类型相匹配。

我该如何正确地做到这一点?

PS:
我不确定我是否在最后一段中描述了我的意图,以便任何人都能理解。但是如果你采用一些通用的伪 C++ 类代码,我想得到以下内容:
list<T> generate-list(LGF<T> f, LGLF<T> locf, int count) { ... }

所以所有的T都是完全一样的。

最佳答案

这里有两个问题,它们都源于同样的混淆。您正在使用泛型类型,ListGenFunction ,而无需告诉 Typed Racket(或您的程序的读者)您正在使用它的特定类型。

例如,f不是任意的 ListGenFunction ,这是一个 ListGenFunction这特别适用于数字。所以你应该写:

(: f (ListGenFunction Integer))


(: locf (ListGenLocFunction Integer))

同样,你应该给 generate-list像这样的类型:
(: generate-list
(All (A)
((ListGenFunction A) (ListGenLocFunction A) Integer -> (Listof A))))

这就像您明确表示您正在生产 (Listof A) 一样。 ,不仅仅是 Listof .

关于racket - 打字 Racket : Creating generic types with define-type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17223087/

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