ADTs in Typed Racket with macros
Немного изящного (макроебства)[http://lexi-lambda.github.io/blog/2015/12/21/adts-in-typed-racket-with-macros/] и в тайпед/ракетке можно юзать ADT с паттерн матчингом.
(Прямо как во взрослых крутых языках).
(define-datatype Expr
(Value Number)
(Add Expr Expr)
(Subtract Expr Expr)
(Multiply Expr Expr)
(Divide Expr Expr))
(: evaluate (Expr -> Number))
(define (evaluate e)
(match e
[(Value x) x ]
[(Add a b) (+ (evaluate a) (evaluate b))]
[(Subtract a b) (- (evaluate a) (evaluate b))]
[(Multiply a b) (* (evaluate a) (evaluate b))]
[(Divide a b) (/ (evaluate a) (evaluate b))]))
> (evaluate (Add (Value 1)
(Multiply (Divide (Value 1) (Value 2))
(Value 7))))
4 1/2
Интересно, ебанется ли кто-нить достаточно чтобы набыдлить какой-нить аналог хаскеля или scalaz?
хули я для тебя The Telescopes скачивал, пидор?
@anonymous и как, скачал?
@ndtimofeev ОХУЕТЬ
@ninesigns #0BIPDB/ZG0
@ndtimofeev нет это сарказм был, потому что пример из /0 с 0.99 вероятностью был передрат из хаскеля или ML
@kuzy000 > Зачем там -> инфиксная?
форма
:'' позволяет инфиксно юзать
->'' (чтобы меньше скобочек возникало при записи типов функций) наряду с префиксной записьюhttp://docs.racket-lang.org/ts-reference/special-forms.html#(form._((lib._typed-racket/base-env/prims..rkt)._~3a))
специальная форма ``:'' на этапе компиляции модуля вычисляется, а не в рантайме
ты должен скормить ``:'' сигнатуру функции, которую потом тайпчекер попробует соотнести с телом функции, если что-то не то скормишь, то получишь compile-time error
@anonymous спс ща качну