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 спс ща качну