(Untitled)

Sep 25, 2014 17:01

Функция - это такая абстракция, которая заставляет внутри делать то, что потом не нужно снаружи.

Есть какая-то экзистенциальная грусть, что в таком вот коде

if (sequence.count() > 1) {
...
}

sequence придется вычислить весь, даже на языке с нормальной системой типов™ и правильной ленивостью™. Как будто два кусочка кода, внутри count() и ( Read more... )

наглядный пример, девелопмент, инструментарий, печально это все

Leave a comment

Comments 119

b0rg September 25 2014, 10:07:40 UTC
Кстати никогда не понимал этой великой мудрости, почему в

interface ICollection
{
add()
remove()
count()
length
}

Есть и count() и length. тяжело сделать синхронизированный счетчик _length и оставить один length?

Reply

tonsky September 25 2014, 11:03:08 UTC
Вы сейчас о чем?

Reply

b0rg September 25 2014, 11:50:26 UTC
Почему в распространном API существуют два метода с практически одинаковым результатом, но различной функциональностью внутри. Что создает только дополнительную путаницу.

На мой взгляд, единственный случай когда существование двух методов оправданно - когда collection/sequence заполняется лениво. Но почему тогда lazy collections пытаются прикидываться обычными collections?

Reply

tonsky September 25 2014, 11:53:17 UTC
я скорее хотел спросить что за API имеется в виду?

Reply


ext_2733391 September 25 2014, 10:14:15 UTC
sequence.is_empty() где-то есть, где-то теоретически не трудно добавить

Reply

tonsky September 25 2014, 11:03:45 UTC
Да я не про сиквенсы, и условие не про is_empty

Reply


theiced September 25 2014, 10:18:24 UTC
ви таки хотите паттерн матчинги наверное?

Reply

tonsky September 25 2014, 11:04:02 UTC
не всегда

Reply


lomeo September 25 2014, 10:28:41 UTC
Если уж очень надо, то в языке "с нормальной системой типов" можно подсыпать числа Пеано, и тогда "правильная ленивость" обеспечит нам проход только нужного участка.

Либо, безотносительно статики/динамики и ленивости/энергичности можно выбрать нужную структуру. Под задачу, как это обычно бывает. Мы же в linked list не используем random access.

Хотя обычно, конкретно для этого случая (единица) всё просто.

Reply

tonsky September 25 2014, 11:05:27 UTC
Понятно что для конкретно этого случая все решается функцией has_at_least(N), но я же не об этом, а вообще о всей концепции вот этой «вызова функции»

Reply

lomeo September 25 2014, 11:11:46 UTC
Разделяю грусть, но предлагаю быть оптимистом. Вон сейчас суперкомпиляция/специализация шустро развиваются, например.

Reply

sassa_nf September 25 2014, 12:42:58 UTC
вот-вот.

Поскольку 1×A≡A, то Nat=1+Nat ≡ List(1)=1+1×List(1), а ленивые числа Пеано изоморфны ленивым спискам единиц.

Reply


daedmen September 25 2014, 10:47:19 UTC
Интересно, а вообще в каких-нибудь ЯПах была возможность нормальной остановки reduce(без исключений и прочих извращений)? А то без функциональщины же это легко делается через цикл и break внутри.

Reply

lomeo September 25 2014, 11:00:13 UTC
Так ленивость же для правой свёртки.

Reply

dmytrish September 25 2014, 11:13:38 UTC
Через продолжения можно выскочить из куда угодно в куда угодно:

(define (list-find lst val)
;; сохраняем continuation как переменную return:
(call/cc (lambda (return)
(for-each (lambda (v)
(if (eqv? val v)
;; все тело call/cc «отменяется»
;; и его значением становится v:
(return v)
#f))
lst)
#f)))

В Хаскеле есть Control.Monad.Cont, еще и типизированный.

Reply

wizzard0 September 25 2014, 11:42:48 UTC
Ну, делается reduce который принимает (...)->Option[T]

Reply


Leave a comment

Up