Oleg
кана
В стм твар явно определен как ньютайп поверх 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
Aleksei (astynax)
И его сейчас поругают
Aleksei (astynax)
Кана, убери мат быстрее
кана
Нет
Dmitry
Вот один так тоже отказывался правила выполнять, и теперь полинтернета поломалось
A64m
ПОЛОМАЛОСЬ (ВИДИМО САМО)
Anonymous
Вот фатальный недостаток Haskell:
Есть ключевое слово where которое поднимает языка на десять порядков выше чем он был-бы без него.
Но не смотря на все удобства where, код становится сложно тестировать, ведь такие функции отдельно не проверишь.
(я плохо знаю Haskell, т.к. всего лишь прочитал пару глав RWH, и по несколько глав из других книг, пока выбирал ту по которой учить язык.)
A64m
заходите отладчиком и проверяете
Anonymous
автоматизировать это можно? если нет или сильно сложно, то они "не тестируются".
A64m
доктестом можно, наверное. (не проверял)
Dmitry
В where-блоке просто не надо писать большие функции, которые ты не можешь "глазами" проверить.
Anonymous
согласен, но у меня больше лесенки получаются.
Anonymous
т.е. функции все маленькие, но та функция что на верху, делает слишком много.
Anonymous
т.е. она не делает слишком много, она применяет пару функций, которые применяют пару функций, которые ...
кана
Так может имеет смысл такие функции поднять на топлевел?
кана
В where я держу только то, что без топлевел значения смысла не имеет
кана
Например go)
Anonymous
кана
Спорно
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
Ilya
Anonymous
Anonymous
когда тест не пройдет, что будешь делать?
Aleksei (astynax)
функции во where ещё и параметры надфункции могут замыкать, так что их и читать может быть непросто и выносить тоже
A64m
да даже не "могут замыкать", а почти всегда и замыкают
Aleksei (astynax)
Почти всегда, да. Но иногда встречается код вида
foo x y z =
...
bar x -- всегда вызывается с x
...
where
bar a = ...
Anonymous
правильно, пойдешь отлаживать. А так, сразу бы пошел править сломаную функцию.
Anonymous
т.е. ее не пришлось бы искать.
Ilya
Предлагаешь писать тесты на каждую вспомогательную функцию?
Ilya
*юнит-тесты
Anonymous
я бы так и делал. если бы можно было.
Anonymous
Тесты модулей нужны для того, чтобы автоматом проверять разные части программы\библиотеки. А такие функции тоже чатсть системы.
Ilya
Так и каждую лямбду тогда в топ-левел выносить надо
Ilya
Давать ей имя, и покрывать тестами
Anonymous
Об этом я и говорю. Что это — фатальный недостаток.
Anonymous
я незнаю других языков, в которыз есть что-то на подобии where.
Ilya
Anonymous
а что там в питоне?
Ilya
Можно объявлять функции внутри других функций
Anonymous
покажи как?
Anonymous
они там будут сверху, а не снизу. Так же?
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)
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" по питонячьи :)
Aleksei (astynax)
Разницы с точки зрения тестирования нет.
Anonymous
Aleksei (astynax)
Да блин!
Anonymous
про это я и говорю.
Aleksei (astynax)
Мы про читаемость, мифические 10 порядков, или всё же про тестирование?
Anonymous
я не хочу писать непонятный код.
я хочу писать тестируемый код.
Но вот мои "хотелки" не совместимы, оказывается.
Aleksei (astynax)
Как тестировать вложенную функцию без контекста, который она замыкает?