> 1 <

Автор Сообщение

Михаил

Members


Статус

120 сообщений

Где: ---
Род занятий:
Возраст:

#2641   2010-07-08 21:18 GMT+3 часа(ов)      
Жаль, что при определении типа через define-type, он может зависеть только от набора других типов. Например, мне нужен тип Matrix, вот как я его могу определить, используя комбинации из других типов:
 (define-type Matrix (Vectorof (Vectorof Number))) 
Но, под этот тип подпадает очень много всего и, причем, не матриц:
 (define-predicate matrix? Matrix) 
> (matrix? #(#(1 2) #(3 4))) ;это действительно матрица
- : Boolean
#t
> (matrix? #(#(1 2) #(3))) ;а здесь уже не матрица
- : Boolean
#t
Такая ограниченная типизация не греет. Также мне нужен тип Type, чтобы я мог работать с типами, так же как и со всем остальным (мог передавать в функцию и т.п.), чтобы
>(ann Natural Type)
- : Type
Natural
>(ann Type Type)
- : Type
Type
Было бы намного интереснее, если бы Vectorof (Listof и т.п.) был перегружен, чтобы можно было еще задать и число, соответствующее длине вектора, тогда бы можно было написать нечто вроде
(define-type: (foo [a : Type] [n : Natural] [m : Natural]) 
(Vectorof (Vectorof a n) m))
(define-type: (Matrix [n : Natural] [m : Natural]) (foo Natural n m))
Почему они до сих пор этого не сделали? Если я в чем-то неправ или чего-то недопонимаю, то объясните мне.

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 27

#2642   2010-07-09 08:29 GMT+3 часа(ов)      
> Если я в чем-то неправ или чего-то недопонимаю, то объясните мне.
Не парьтесь - переходите на нашу сторону. У нас это есть более двадцати лет. Вот, например, матрица как Вы хотите:
(deftype square-matrix (type size)
`(array ,type (,size ,size)))

отредактировал(а) ander-skirnir: 2010-07-09 08:41 GMT+3 часа(ов)

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 27

#2643   2010-07-09 08:52 GMT+3 часа(ов)      
Это только для квадратной матрицы, а можно гораздо круче - для произвольной:
(defun equidimensional (a)
(or (< (array-rank a) 2)
(apply #'= (array-dimensions a))))
 
(deftype matrix (type)
`(and (array ,type)
(satisfies equidimensional)))


Обратите внимание на satisfies.

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#2644   2010-07-09 17:19 GMT+3 часа(ов)      
В typed racket пока что отсутствует тип данных array(SRFI 25). Почему? Да потому что до него еще руки не дошли)
#lang typed/racket
 
(define-struct: (t) Matrix-Struct
([body : (Vectorof (Vectorof t))]
[col : Exact-Positive-Integer]
[row : Exact-Positive-Integer]))
 
(define-type (Matrixof t) (Matrix-Struct t))
 
(: make-matrix
(Exact-Positive-Integer
Exact-Positive-Integer
Any
->
(Matrixof Any)))
(define (make-matrix row col fill)
(make-Matrix-Struct (make-vector row (make-vector col fill))
col row))
 
(: matrix? (Any -> Boolean))
(define (matrix? m)
(Matrix-Struct? m))
 
(: matrix-col ((Matrixof Any) -> Exact-Positive-Integer))
(define (matrix-col m)
(Matrix-Struct-col m))
 
(: matrix-row ((Matrixof Any) -> Exact-Positive-Integer))
(define (matrix-row m)
(Matrix-Struct-row m))
 
(: matrix-dim=?
((Matrixof Any) (Matrixof Any) -> Boolean))
(define (matrix-dim=? m1 m2)
(and (= (matrix-row m1) (matrix-row m2))
(= (matrix-col m1) (matrix-col m2))))

Михаил

Members


Статус

120 сообщений

Где: ---
Род занятий:
Возраст:

#2646   2010-07-09 20:28 GMT+3 часа(ов)      
2ander-skirnir
это, конечно, все интересно, но тут у нас typed racket, понимаешь.

2misha
> SRFI 25
У них там, кстати, из SRFI только 14, все остальные пока не переписаны. Насчет твоего решения – выходит все дополнительные ограничения можно соблюсти, используя самописный конструктор make-<имя-типа>? Но такое решение не катит: на кой черт тогда нужна такая типизация? Она на то, в частности, и нужна, чтобы make’и всякие и предикаты автоматически создавались, в соответствии указанному типу. Или, может, я заблуждаюсь?

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#2647   2010-07-09 23:59 GMT+3 часа(ов)      
>Но такое решение не катит: на кой черт тогда нужна такая типизация? Она на то, в частности, и нужна, чтобы make’и всякие и предикаты автоматически создавались, в соответствии указанному типу.
define-type непреднозначен для создания сложных типов данных. А конструктор и предикаты так или иначе писать придется.

Остается только дождаться когда они классы к typed racket прикрутят.

P.S. При написании поста у меня в третий раз за неделю сдох xorg=(.

Михаил

Members


Статус

120 сообщений

Где: ---
Род занятий:
Возраст:

#2648   2010-07-10 01:42 GMT+3 часа(ов)      
Не а, предикаты писать вручную не нужно, ведь есть define-predicate. Конструкторы тоже, только, надеюсь пока, для структур.

Михаил

Members


Статус

120 сообщений

Где: ---
Род занятий:
Возраст:

#2650   2010-07-10 02:06 GMT+3 часа(ов)      
И define-type тоже не нужен. Типы должны быть такими же объектами, как и все остальное и тоже иметь свой тип... В общем, у меня есть виденье идеальной (на мой взгляд) статической типизации в scheme. Могу вкратце осветить (но это лишь черновик-набросок идеи, т.е. ничего конкретного, если неинтересно, то можете даже не смотреть и не пытаться вникнуть):
;(get-type obj) 
;(fun-of t1 ... tN -> t)
;(.lambda t args . body)
;(.define name val) - переменной можно присвоить (с помощью .set!) значение другого типа
;не такого, какой у нее был ранне
;(.define t (name . args) . body)
 
;(define-maker name t)
;(define-predicate name t)
 
;#|
;Примеры:
(.define
add (.lambda
(fun-of number number -> number)
(x y)
(+ x y)))
 
(.define
(fun-of number number -> number)
(add x y)
(+ x y))
 
(.define x 15)
(.set! x "asdf")
 
>(get-type x)
string
 
>(get-type add)
(fun-of number number -> number)
 
>(get-type (fun-of number number -> number))
ftype
 
>(get-type number)
type
 
>(get-type ftype)
type
 
>(get-type type)
type
 
(.define (fun-of type number number -> type)
(matrix t col row)
(vector-of (vector-of t col) row))
 
(.define ((.lambda (fun-of type -> ftype)
(a)
(fun-of (list-of a) -> natural))
any)
(my-length l)
(if (null? l) 0 (+ 1 (my-length (cdr l)))))
 
(.define (fun-of (list-of any) -> natural)
(my-length l)
(if (null? l) 0 (+ 1 (my-length (cdr l)))))
;|#

Михаил

Members


Статус

120 сообщений

Где: ---
Род занятий:
Возраст:

#2669   2010-07-26 18:57 GMT+3 часа(ов)      
2ander-skirnir
Поясню, почему CL в пролете:
(defun f (x y)
(declare (type integer x)
(type integer y))
(* x y))
 
>(type-of #'f)
FUNCTION
У вас все функции имеют один тип.

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#2684   2010-08-03 15:55 GMT+3 часа(ов)      
Для этого придумали делегаты.

Михаил

Members


Статус

120 сообщений

Где: ---
Род занятий:
Возраст:

#2685   2010-08-03 16:59 GMT+3 часа(ов)      
Чиво? Какие в СL делегаты? По-моему они только в .NET языках. И какое они вообще имеют отношение к теме?

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#2686   2010-08-03 17:56 GMT+3 часа(ов)      
>Чиво? Какие в СL делегаты? По-моему они только в .NET языках.
Delegates

>И какое они вообще имеют отношение к теме?
Можно создать структуру(либо класс) для хранения сведений о функции(или любом другом объекте).

Михаил

Members


Статус

120 сообщений

Где: ---
Род занятий:
Возраст:

#2687   2010-08-03 19:00 GMT+3 часа(ов)      
Суть в том, что нужен тип, а не костыли поверх языка. Как мне писать ФВП?

antares0

Members


Статус

185 сообщений

Где: Russia
Род занятий:
Возраст:

#2688   2010-08-04 02:23 GMT+3 часа(ов)      
Есть funcаllable-instance, есть ftype. Только функции высших порядков перпендикулярны (на мой взгляд) типам и классам.

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#2689   2010-08-04 15:16 GMT+3 часа(ов)      
Рэкет все-таки нагляднее
(define-type CUBE (Number -> Number))
(: ^2 CUBE)
(define (^2 x) (* x x))
 
(define-type SUM (Number * -> Number))
(: sum SUM)
(define (sum . x) (apply + x))

отредактировал(а) misha: 2010-08-04 15:28 GMT+3 часа(ов)
> 1 <


Онлайн :

0 пользователь(ей), 28 гость(ей) :




Реклама на сайте: