Мохнатые уроды и моральные пёзды. Войти !bnw Сегодня Клубы

Просто и элегантно.
Спасибо динамической типизации!

#lang racket
(require math)
(require racket/match)

(define (inverse func)
  (match func
    ['exp log]
    ['cos acos]
    [_ #f]))

(printf "Inv[~a](~a) = ~a\n" 'exp (exp 1) ((inverse 'exp) (exp 1)))
(printf "Inv[~a](~a) = ~a\n" 'cos 1       ((inverse 'cos) 1))

http://pasterack.org/pastes/74110

Inv[exp](2.718281828459045) = 1.0
Inv[cos](1) = 0

#F6MJXE / @ninesigns / 3300 дней назад

Я тебе тему для следующей серии придумал: в Java нельзя делать switch на строки (из-за статической типизации, конечно).

#F6MJXE/5CK / @minoru / 3300 дней назад
@minoru ле, правда штоле? я уже и забыл. они же всё равно интернируются, какая проблема сделать-то.
#F6MJXE/N6V / @anonymous --> #F6MJXE/5CK / 3300 дней назад
Бля в хаскеле нельзя сравнивать функции.
#F6MJXE/FXX / @l29ah / 3300 дней назад

@anonymous Отбой, в JDK 7 завезли: http://stackoverflow.com/a/338230 Олсо ты путаешь строковые литералы и строки.

#F6MJXE/0YP / @minoru --> #F6MJXE/N6V / 3300 дней назад
банальная хуита. вот я помню года три назад на хачкеле читал такой-то перл тоже про обратные функции. там было круто. сейчас уж не могу найти.
#F6MJXE/BXE / @anonymous / 3300 дней назад

@l29ah ОП сравнивает имена, а не сами функции. Подозреваю, что то же самое можно сделать с помощью Template Haskell, но я его не шарю.

#F6MJXE/GJ7 / @minoru --> #F6MJXE/FXX / 3300 дней назад
@minoru строки тоже интернируются, не всегда правда
#F6MJXE/RRY / @anonymous --> #F6MJXE/0YP / 3300 дней назад

@anonymous Moar, ну или кейвордов для гугла хотя бы.

#F6MJXE/9W2 / @minoru --> #F6MJXE/RRY / 3300 дней назад
@minoru >To save memory (and speed up testing for equality), Java supports “interning” of Strings. //все нормальные динамические петухи делают ето
#F6MJXE/E7R / @anonymous --> #F6MJXE/9W2 / 3300 дней назад
@l29ah зачем сравнивать вещи которые известны в компайл-тайме?
#F6MJXE/EG1 / @anonymous --> #F6MJXE/FXX / 3300 дней назад

@minoru уже можно, с седьмой

#F6MJXE/40Z / @kerrigan --> #F6MJXE/5CK / 3300 дней назад

@kerrigan Уже знаю, см. /0YP

#F6MJXE/LYT / @minoru --> #F6MJXE/40Z / 3300 дней назад

@anonymous Да всем давно понятно без пруфов, что хаскель тупо круче

#F6MJXE/O3Q / @ninesigns --> #F6MJXE/BXE / 3300 дней назад
@anonymous Не известны.
#F6MJXE/DZ4 / @l29ah --> #F6MJXE/EG1 / 3300 дней назад
@minoru А ещё ОП может вызывать функции по их имени.
#F6MJXE/8K2 / @anonymous --> #F6MJXE/GJ7 / 3300 дней назад

@anonymous Спасибо динамической типизации! // Что сказать-то хотел?

#F6MJXE/YR8 / @minoru --> #F6MJXE/8K2 / 3300 дней назад
@minoru То, что, скажем поддержка двойной инверсии `((inverse (inverse 'exp)) 1)` потребует незначительных изменений в коде ОПа, а в варианте с Template Haskell, подозреваю, те ещё костыли будут.
#F6MJXE/N2F / @anonymous --> #F6MJXE/YR8 / 3300 дней назад

@anonymous Ну, опять-таки: я его не шарю, представление о TH у меня очень размытое. Но в моём понимании мы там будем просто смотреть на AST, в котором видно имя функции, и подменять это самое имя (тупо case, конвертирующий из строки в строку, как и на язычке ОПа).

#F6MJXE/ORC / @minoru --> #F6MJXE/N2F / 3300 дней назад

@minoru заметь, что в коде ОПа нет макросов)))

#F6MJXE/AH6 / @ninesigns --> #F6MJXE/ORC / 3300 дней назад
@minoru А если так? Тут «имя» из AST уже не достать. ``` #lang racket (require math) (require racket/match) (define (inverse func) (match func [exp log] [cos acos] [_ #f])) (define косинус cos) (printf "Inv[~a](~a) = ~a\n" cos 1 ((inverse cos) 1)) (printf "Inv[~a](~a) = ~a\n" косинус 1 ((inverse косинус) 1)) ```
#F6MJXE/Q9U / @anonymous --> #F6MJXE/ORC / 3300 дней назад

@ninesigns И что? Когда уже ты поймёшь, что для разных языков свойственно решать одни и те же задачи по-разному? Более того, когда до тебя дойдёт, что в этом и есть суть создания такого большого количества языков, которые имеем сейчас?

#F6MJXE/WMR / @minoru --> #F6MJXE/AH6 / 3300 дней назад

@anonymous И что, это работает?

#F6MJXE/KBW / @minoru --> #F6MJXE/Q9U / 3300 дней назад

@minoru ``косинус'' eval-ится в #<procedure:cos> перед апликацией inverse.
NAP не нарушен.

#F6MJXE/7DQ / @ninesigns --> #F6MJXE/KBW / 3300 дней назад
@minoru Как оказалось, не так как хотелось. Вот это работает: ``` #lang racket (require math) (require racket/match) (define (inverse func) (cond [(eq? func exp) log] [(eq? func cos) acos] [#t #f])) (define экспонента exp) (define косинус cos) (printf "Inv[~a](~a) = ~a\n" экспонента (экспонента 1) ((inverse экспонента) (экспонента 1))) (printf "Inv[~a](~a) = ~a\n" косинус 1 ((inverse косинус) 1)) (define (test-inverse func value) (printf "~a ~a ~a" (func value) ((inverse func) (func value)) value)) ``` ``` Inv[#<procedure:exp>](2.718281828459045) = 1.0 Inv[#<procedure:cos>](1) = 0 ```
#F6MJXE/EAK / @anonymous --> #F6MJXE/KBW / 3300 дней назад

@ninesigns Окей; в моём представлении о TH, он действительно соснёт в таком случае.

#F6MJXE/VFO / @minoru --> #F6MJXE/7DQ / 3300 дней назад

@anonymous ничего сложного:
```

lang racket

(require math)
(require racket/match)

(define (inv func)
(cond [(eq? func log) exp]
[(eq? func exp) log]
[#t #f]))

(printf "Inv^2[~a](~a)=~a" exp 1 (((compose inv inv) exp) 1))
;;; Inv^2[#<procedure:exp>](1)=2.718281828459045

#F6MJXE/N2Z / @ninesigns --> #F6MJXE/N2F / 3300 дней назад
Пук. ```c++ template <typename F> auto inverse(F f) { if(f == &exp) { return &log; } else if(f == &cos) { return &acos; } throw std::runtime_error {"std::static_error // huerror"}; } ```
#F6MJXE/IHB / @kuzy000 / 3299 дней назад
#F6MJXE/FGH / @kuzy000 --> #F6MJXE/IHB / 3299 дней назад
@minoru > TH ```c #define CONCAT(A, B) A ## B #define INVERSE_cos acos #define INVERSE_exp log #define INVERSE(F) CONCAT(INVERSE_, F) #define kosinus cos ``` Как насчет CPP? // http://goto.ucsd.edu/~rjhala/Annot/Cabal/Language-Haskell-Extension.html#v:CPP КАЖДОЙ ЗАДАЧЕ СВОЕ РЕШЕНИЕ
#F6MJXE/GXG / @kuzy000 --> #F6MJXE/VFO / 3299 дней назад
#F6MJXE/8EV / @l29ah --> #F6MJXE/GXG / 3299 дней назад

@kuzy000

#F6MJXE/PBI / @minoru --> #F6MJXE/GXG / 3299 дней назад

@minoru если я это пойму, то о чем мне будет срать в интернетах?

#F6MJXE/XR9 / @ninesigns --> #F6MJXE/WMR / 3299 дней назад
@ninesigns О напе канеш.
#F6MJXE/XBT / @l29ah --> #F6MJXE/XR9 / 3299 дней назад

@ninesigns Зачем срать в Интернетах?

#F6MJXE/XRH / @minoru --> #F6MJXE/XR9 / 3299 дней назад

@minoru ловить лулзы

#F6MJXE/8ZW / @ninesigns --> #F6MJXE/XRH / 3299 дней назад

@ninesigns С ещё не понявших? Какой в этом толк? // Я понимаю, конечно, что срачики часто подталкивают народ сесть и разобраться в каком-то отдельно взятом вопросе — на собственной шкуре не раз испытал :) Выходит, вбросы — это такая форма community service?

#F6MJXE/ZWT / @minoru --> #F6MJXE/8ZW / 3299 дней назад

@minoru служу бнвачу

#F6MJXE/6QY / @ninesigns --> #F6MJXE/ZWT / 3299 дней назад

@l29ah свежо

#F6MJXE/EF0 / @ninesigns --> #F6MJXE/P3L / 3299 дней назад
ipv6 ready BnW для ведрофона BnW на Реформале Викивач Котятки

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