require/typed 球拍合约失败
require/typed contract in racket fails
我试过查看文档,但找不到可用于我的案例的示例。我需要从 srfi/1 导入 break。
这是我的尝试。该示例适用于#lang 球拍。
#lang typed/racket
(require/typed (only-in srfi/1 break)
;[break (All (T) (-> (-> T Boolean) (Listof T) (Listof T)))])
;[break (All (T) (-> (-> T Boolean) (Values (Listof T) (Listof T))))])
[break (All (T) (-> (-> String (U False (Listof T))) (Listof T) (Listof T)))])
(define entity-types '("3DFACE" "3DSOLID" "ACAD_PROXY_ENTITY" "ARC" "ARCALIGNEDTEXT" "ATTDEF" "ATTRIB" "BODY" "CIRCLE" "DIMENSION" "ELLIPSE" "HATCH" "IMAGE" "INSERT" "LEADER" "LINE" "LWPOLYLINE" "MLINE" "MTEXT" "OLEFRAME" "OLE2FRAME" "POINT" "POLYLINE" "RAY" "REGION" "RTEXT" "SEQEND" "SHAPE" "SOLID" "SPLINE" "TEXT" "TOLERANCE" "TRACE" "VERTEX" "VIEWPORT" "WIPEOUT" "XLINE"))
(define lst '("ENTITIES" "0" "LINE" "5" "BA1C" "330" "1F" "100" "AcDbEntity" "8" "0" "370" "0" "100" "AcDbLine" "10" "253.2926653556182" "20" "1478.621431186484" "30" "0.0" "11" "253.2876653556182" "21" "1478.621431186484" "31" "0.0" "0" "LINE" "5" "BA1D" "330" "1F" "100" "AcDbEntity" "8" "0" "370" "0" "100" "AcDbLine" "10" "253.2876653556182" "20" "1478.621431186484" "30" "0.0" "11" "253.2876653556182" "21" "1476.655431186484" "31" "0.0" "0" "LINE" "5" "BA1E" "330" "1F" "100" "AcDbEntity" "8" "0" "370" "0" "100" "AcDbLine" "10" "253.2926653556182" "20" "1476.655431186484" "30" "0.0" "11" "253.2876653556182" "21" "1476.655431186484" "31" "0.0" "0" "LINE" "5" "BA1F" "330" "1F" "100" "AcDbEntity" "8" "0" "370" "0" "100" "AcDbLine" "10" "253.2926653556182" "20" "1476.655431186484" "30" "0.0" "11"))
(break (lambda ([x : String]) (member x entity-types)) lst)
这对我有用:
(require/typed (only-in srfi/1 break)
[break (All (T) (-> (-> T (U False (Listof T))) (Listof T)
(values (Listof T) (Listof T))))])
请注意 member
returns #f
或第一个元素是要搜索的元素的列表。因此示例 (lambda ([x : String]) (member x entity-types))
中的谓词具有类型 (-> T (U False (Listof T)))
.
最后需要values
表示break
returns多个值
这是我要分配给 break
的类型:
(require/typed
(only-in srfi/1 break)
[break (All [T] (-> (T -> Any) (Listof T)
(Values (Listof T) (Listof T))))])
谓词函数可以return任何东西。如果它 returns #f
,它将被视为 falsy,而任何其他结果都将被视为 truthy。此外,正如 soegaard 提到的,需要 Values
类型构造函数来指示 break
return 的多个值。
然而,Racket实际上包含了一个与break
非常相似的功能,但它实际上等同于span
。该函数本身称为 splitf-at
,根据该函数很容易实现 break
而不是使用 srfi/1
.
(: break (All [T] (-> (T -> Any) (Listof T)
(Values (Listof T) (Listof T)))))
(define (break pred lst)
(splitf-at lst (negate pred)))
我试过查看文档,但找不到可用于我的案例的示例。我需要从 srfi/1 导入 break。
这是我的尝试。该示例适用于#lang 球拍。
#lang typed/racket
(require/typed (only-in srfi/1 break)
;[break (All (T) (-> (-> T Boolean) (Listof T) (Listof T)))])
;[break (All (T) (-> (-> T Boolean) (Values (Listof T) (Listof T))))])
[break (All (T) (-> (-> String (U False (Listof T))) (Listof T) (Listof T)))])
(define entity-types '("3DFACE" "3DSOLID" "ACAD_PROXY_ENTITY" "ARC" "ARCALIGNEDTEXT" "ATTDEF" "ATTRIB" "BODY" "CIRCLE" "DIMENSION" "ELLIPSE" "HATCH" "IMAGE" "INSERT" "LEADER" "LINE" "LWPOLYLINE" "MLINE" "MTEXT" "OLEFRAME" "OLE2FRAME" "POINT" "POLYLINE" "RAY" "REGION" "RTEXT" "SEQEND" "SHAPE" "SOLID" "SPLINE" "TEXT" "TOLERANCE" "TRACE" "VERTEX" "VIEWPORT" "WIPEOUT" "XLINE"))
(define lst '("ENTITIES" "0" "LINE" "5" "BA1C" "330" "1F" "100" "AcDbEntity" "8" "0" "370" "0" "100" "AcDbLine" "10" "253.2926653556182" "20" "1478.621431186484" "30" "0.0" "11" "253.2876653556182" "21" "1478.621431186484" "31" "0.0" "0" "LINE" "5" "BA1D" "330" "1F" "100" "AcDbEntity" "8" "0" "370" "0" "100" "AcDbLine" "10" "253.2876653556182" "20" "1478.621431186484" "30" "0.0" "11" "253.2876653556182" "21" "1476.655431186484" "31" "0.0" "0" "LINE" "5" "BA1E" "330" "1F" "100" "AcDbEntity" "8" "0" "370" "0" "100" "AcDbLine" "10" "253.2926653556182" "20" "1476.655431186484" "30" "0.0" "11" "253.2876653556182" "21" "1476.655431186484" "31" "0.0" "0" "LINE" "5" "BA1F" "330" "1F" "100" "AcDbEntity" "8" "0" "370" "0" "100" "AcDbLine" "10" "253.2926653556182" "20" "1476.655431186484" "30" "0.0" "11"))
(break (lambda ([x : String]) (member x entity-types)) lst)
这对我有用:
(require/typed (only-in srfi/1 break)
[break (All (T) (-> (-> T (U False (Listof T))) (Listof T)
(values (Listof T) (Listof T))))])
请注意 member
returns #f
或第一个元素是要搜索的元素的列表。因此示例 (lambda ([x : String]) (member x entity-types))
中的谓词具有类型 (-> T (U False (Listof T)))
.
最后需要values
表示break
returns多个值
这是我要分配给 break
的类型:
(require/typed
(only-in srfi/1 break)
[break (All [T] (-> (T -> Any) (Listof T)
(Values (Listof T) (Listof T))))])
谓词函数可以return任何东西。如果它 returns #f
,它将被视为 falsy,而任何其他结果都将被视为 truthy。此外,正如 soegaard 提到的,需要 Values
类型构造函数来指示 break
return 的多个值。
然而,Racket实际上包含了一个与break
非常相似的功能,但它实际上等同于span
。该函数本身称为 splitf-at
,根据该函数很容易实现 break
而不是使用 srfi/1
.
(: break (All [T] (-> (T -> Any) (Listof T)
(Values (Listof T) (Listof T)))))
(define (break pred lst)
(splitf-at lst (negate pred)))