кана
В стм твар явно определен как ньютайп поверх ioref Если там какая-то шутка, я то я ее не понял
Alexander
не определен
Зигохистоморфный
Alexander
-- |Shared memory locations that support atomic memory transactions. data TVar a = TVar (TVar# RealWorld a)
Alexander
и никогда не мог быть определен как ньютайп
кана
Так бля да, это я перепутал с STM
Зигохистоморфный
вон в пурсе вообще ничего нет кроме AVar https://github.com/slamdata/purescript-aff#avars
Denis
newtype STM a = STM (IORef (IO ()) -> IO a)
Oleg
Так бля да, это я перепутал с STM
а вот меня бэтман ругал за мат
Aleksei (astynax)
И его сейчас поругают
Aleksei (astynax)
Кана, убери мат быстрее
кана
Нет
Dmitry
Вот один так тоже отказывался правила выполнять, и теперь полинтернета поломалось
A64m
ПОЛОМАЛОСЬ (ВИДИМО САМО)
Anonymous
Вот фатальный недостаток Haskell: Есть ключевое слово where которое поднимает языка на десять порядков выше чем он был-бы без него. Но не смотря на все удобства where, код становится сложно тестировать, ведь такие функции отдельно не проверишь. (я плохо знаю Haskell, т.к. всего лишь прочитал пару глав RWH, и по несколько глав из других книг, пока выбирал ту по которой учить язык.)
A64m
заходите отладчиком и проверяете
Anonymous
автоматизировать это можно? если нет или сильно сложно, то они "не тестируются".
A64m
доктестом можно, наверное. (не проверял)
Dmitry
В where-блоке просто не надо писать большие функции, которые ты не можешь "глазами" проверить.
Anonymous
согласен, но у меня больше лесенки получаются.
Anonymous
т.е. функции все маленькие, но та функция что на верху, делает слишком много.
Anonymous
т.е. она не делает слишком много, она применяет пару функций, которые применяют пару функций, которые ...
кана
Так может имеет смысл такие функции поднять на топлевел?
кана
В where я держу только то, что без топлевел значения смысла не имеет
кана
Например go)
Anonymous
Так может имеет смысл такие функции поднять на топлевел?
нет, не стоит, т.к. код с where сильно понятнее.
кана
Спорно
Anonymous
Спорно
зачем повышать до "настоящей" функции то, что нигде не используется кроме одной функции?
кана
f x = g x where g x = h x f x = g x g x = h x Если g имеет смысл вне f, то вполне логично его вынести
кана
зачем повышать до "настоящей" функции то, что нигде не используется кроме одной функции?
Чтобы не делать эту функцию большой, очевидно, упростить читаемость
Anonymous
читаемость наоборот ухудшается.
кана
Ну это субъективно, прочитать 3 простых однострочника с сигнатурой мне проще, чем один многострочный лесенкой комбайн
Anonymous
я так и знал, что это фатальный недостаток. Очень долго думал, как это исправить. "С силой приходит ответственность".
A64m
сложнее, три однострочника с сигнатурами все читаются, а иерархическая структура позволяет не читать то, что не надо, пока не разбираешься в конкретных деталях
A64m
если все функции топлевелные - трудно понять что можно не читать
Anonymous
+
Andrey
+. но можно оттестировать их на верхнем уровне а потом засунуть в where
Anonymous
+. но можно оттестировать их на верхнем уровне а потом засунуть в where
Это не автоматизируется == такие функции не тестируются.
Ilya
Это не автоматизируется == такие функции не тестируются.
Тестируются при разработке, а в дальнейшем достаточно автоматически тестировать top-level функцию
Anonymous
когда тест не пройдет, что будешь делать?
Aleksei (astynax)
функции во where ещё и параметры надфункции могут замыкать, так что их и читать может быть непросто и выносить тоже
A64m
да даже не "могут замыкать", а почти всегда и замыкают
Aleksei (astynax)
Почти всегда, да. Но иногда встречается код вида foo x y z = ... bar x -- всегда вызывается с x ... where bar a = ...
Ilya
когда тест не пройдет, что будешь делать?
Не понял, а в чём тут разница в отладке, если бы все функции были top-level?
Anonymous
правильно, пойдешь отлаживать. А так, сразу бы пошел править сломаную функцию.
Anonymous
т.е. ее не пришлось бы искать.
Ilya
Предлагаешь писать тесты на каждую вспомогательную функцию?
Ilya
*юнит-тесты
Anonymous
я бы так и делал. если бы можно было.
Anonymous
Тесты модулей нужны для того, чтобы автоматом проверять разные части программы\библиотеки. А такие функции тоже чатсть системы.
Ilya
Так и каждую лямбду тогда в топ-левел выносить надо
Ilya
Давать ей имя, и покрывать тестами
Anonymous
Об этом я и говорю. Что это — фатальный недостаток.
Ilya
Об этом я и говорю. Что это — фатальный недостаток.
В каком другом языке можно покрывать лямбды юнит тестами?
Anonymous
я незнаю других языков, в которыз есть что-то на подобии where.
Anonymous
а что там в питоне?
Ilya
Можно объявлять функции внутри других функций
Anonymous
покажи как?
Anonymous
они там будут сверху, а не снизу. Так же?
Anonymous
я незнаю других языков, в которыз есть что-то на подобии where.
я не писал, что не знаю языков в которых есть локальные функции, или лямбды.
Aleksei (astynax)
foo = let bar x = x * 2 in bar 42 vs foo = bar 42 where bar x = x * 2 никакой разницы между "сверху" и "снизу" с точки зрения тестирования
Anonymous
вот про что я:
Anonymous
сложнее, три однострочника с сигнатурами все читаются, а иерархическая структура позволяет не читать то, что не надо, пока не разбираешься в конкретных деталях
Anonymous
если все функции топлевелные - трудно понять что можно не читать
Aleksei (astynax)
Все лиспы, например
Ilya
покажи как?
def sum(x, y): def sum_x(z): return x+z return sum_x(y) print(sum(4,5))
Aleksei (astynax)
^ это "let" по питонячьи :)
Anonymous
А уж языков с let - полно
let вовсе не "поднимает язык на 10 порядков".
Aleksei (astynax)
Разницы с точки зрения тестирования нет.
Ilya
let вовсе не "поднимает язык на 10 порядков".
Не вижу разницы между let и where в вопросе тестирования не-top-level функций
Anonymous
Разницы с точки зрения тестирования нет.
нет, а вот с читаемостью есть.
Aleksei (astynax)
Да блин!
Anonymous
про это я и говорю.
Aleksei (astynax)
Мы про читаемость, мифические 10 порядков, или всё же про тестирование?
Anonymous
я не хочу писать непонятный код. я хочу писать тестируемый код. Но вот мои "хотелки" не совместимы, оказывается.
Aleksei (astynax)
Как тестировать вложенную функцию без контекста, который она замыкает?