БЕГЕМОТИКОВ МОЖНО! Войти !bnw Сегодня Клубы

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?

#R60TPL / @ninesigns / 3256 дней назад

хули я для тебя The Telescopes скачивал, пидор?

#R60TPL/55L / @anonymous / 3256 дней назад

@anonymous и как, скачал?

#R60TPL/GRA / @ninesigns --> #R60TPL/55L / 3256 дней назад
``` data Expr = Value Rational | Add Expr Expr | Subtract Expr Expr | Multiply Expr Expr | Divide Expr Expr evaluate :: Expr -> Rational evaluate expr = case expr of 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 ```
#R60TPL/8QC / @ndtimofeev / 3256 дней назад

@ndtimofeev ОХУЕТЬ

#R60TPL/556 / @ninesigns --> #R60TPL/8QC / 3256 дней назад

@ninesigns #0BIPDB/ZG0

#R60TPL/C9O / @anonymous --> #R60TPL/GRA / 3256 дней назад
@ninesigns Ты ожидал увидеть что-то другое?
#R60TPL/EDC / @ndtimofeev --> #R60TPL/556 / 3256 дней назад

@ndtimofeev нет это сарказм был, потому что пример из /0 с 0.99 вероятностью был передрат из хаскеля или ML

#R60TPL/EF5 / @ninesigns --> #R60TPL/EDC / 3256 дней назад
Заметьте, в варианте на хаскеле ни одной скобки.
#R60TPL/BQ4 / @anonymous / 3256 дней назад
@anonymous Заметил. Дальше что делать?
#R60TPL/S2A / @kuzy000 --> #R60TPL/BQ4 / 3256 дней назад
Зачем там -> инфиксная? Алсо, какое значение у (: evaluate (Expr -> Number))? А если что-то не то скормить `:`, то какое? // лень его ставить ппц
#R60TPL/EX0 / @kuzy000 / 3256 дней назад

@kuzy000 > Зачем там -> инфиксная?
форма :'' позволяет инфиксно юзать->'' (чтобы меньше скобочек возникало при записи типов функций) наряду с префиксной записью
http://docs.racket-lang.org/ts-reference/special-forms.html#(form._((lib._typed-racket/base-env/prims..rkt)._~3a))

какое значение у (: evaluate (Expr -> Number))?

специальная форма ``:'' на этапе компиляции модуля вычисляется, а не в рантайме

А если что-то не то скормить : то какое?

ты должен скормить ``:'' сигнатуру функции, которую потом тайпчекер попробует соотнести с телом функции, если что-то не то скормишь, то получишь compile-time error

#R60TPL/05D / @ninesigns --> #R60TPL/EX0 / 3256 дней назад
@kuzy000 подрочить, тупой штоле ``` ( ( ) ( ) ( ) ( ) ( )) ( ( )) ( ( ) ( [( ) ] [( ) ( ( ) ( ))] [( ) ( ( ) ( ))] [( ) ( ( ) ( ))] [( ) ( ( ) ( ))])) ```
#R60TPL/S9E / @anonymous --> #R60TPL/S2A / 3256 дней назад

@anonymous спс ща качну

#R60TPL/4R3 / @ninesigns --> #R60TPL/C9O / 3255 дней назад
@anonymous лейс
#R60TPL/H7N / @anonymous --> #R60TPL/S9E / 3255 дней назад
ipv6 ready BnW для ведрофона BnW на Реформале Викивач Котятки

Цоперайт © 2010-2016 @stiletto.