Alexander
вот, гарантируется ли в первом и втором случае что a вычислено до WHNF
Alexander
(интересует теоритическая гарантия, а не то, что в большинстве случаев будет на практике)
Cheese
в первом случае тоже case в начале?
Cheese
не вижу, откуда могут возникнуть сомнения
Cheese
сравнение с 5 вычисляет seq a (error "foo" :: Int), которое вычисляет a
Cheese
и с evaluate та же петрушка
Cheese
а на практике что?
Alexander
с того, что очередность выполнения первого и второго агрумента не определена
Alexander
исключение может выполниться раньше, чем выполнится a
Alexander
вывалиться
Alexander
на практике, скорее всего вычислится
Cheese
а, действительно, я первый раз прочитал доку на seq
Cheese
тогда в обоих случаях нет гарантии
Cheese
то есть в обоих случаях может исключение вылететь раньше, чем вычислится a
Alexander
вот мне тоже так кажется
Cheese
опять же, непонятно, откуда сомнения
Alexander
ну мало-ли
Alexander
может ghc specifics на которые все опираются
Alexander
мне просто интересно почему для линейных типов другого поведения ожидают
Cheese
если нужна гарантия, то evaluate a >> error "foo", если у тебя есть IO, и error (seq a "foo"), если без IO
Cheese
может, наоборот, хочется определённости, и для этого вводят определённость в линейные типы? а seq тут совсем ни при чём
Alexander
нет, людям хочется = они безосновательно решили, что линейные типы должны им это предоставлять
Alexander
если нужна гарантия то есть pseq
Cheese
впрочем, насчёт error (seq a "foo") я не прав. здесь a вычитслится до того, как исключение будет выведено на экран, только и всего
Alexander
@A64m_qb0 а ты понял про какие проблемы с unboxed Картер говорил?
Alexander
что в спеке не сказано, что значит что unboxed value использована?
Leonid 🦇
Alexander
прополаз linear-types
Alexander
там треш и угар в коментариях
Denis
расскажите когда закончится это всё, прочту потом одним дублем с выражением
Alexander
лучше достоевского книжку возьми, меньше времени потратишь
Denis
Достоевского я уже читал, а это нет. Жизнь слишком коротка, чтобы книжки перечитывать.
Alexander
да пофиг
A64m
где-то в самом начале обсуждения вопрос-ответ
Alexander
этот пропозал про тайпчекер, а не про эффективность же
Alexander
ради эффективности можно Unrestricted# притащить, работающий примерно как ByteArray# наверное?
Alexander
(# Int#, Unrestricted# Int# #)
A64m
ну эффективность IO-трюка для хаскеля штука довольно важная, тормозной LIO это неприятно
Alexander
где Unrestricted# :: # -> # имеет тот же размер, и прочее
Alexander
не все сразу же
Alexander
может ещё сразу отвельный хип запилить?
A64m
отдельный хип можно и самому накостылить
Alexander
своё IO тоже
Alexander
я за последние 2 дня три шутки сделал : ]
Alexander
btw unrestricted is done on the library level too
Alexander
опс
Alexander
в общем анрестриктед тоже уровня библиотеки сейчас
Alexander
хм..
Alexander
неожиданно
Alexander
у них проблемы будут если это не что-то специальное
Alexander
т.е. ливити полиморфный newtype Unrestrictited# a= Unrestricted# a незя
Alexander
возможно даже для # он будет криво работать
Unat
Ребята, кто сможет сказать, где я свернул не туда с разбором результатов запроса к БД? https://i.imgur.com/b8trUrl.png
Unat
выглядит как нечто невероятно стремное
a66ath
Кажется, что можно было использовать »= вместо case
a66ath
>>=
Алексей
А ещё do-нотация
a66ath
Хотя нет
a66ath
Недосмотрел
Alexander
а можно пасты текстом чтобы их копировать можно было?
Alexander
очень не круто перечепятывать
Unat
class FromRow a where
fromRow :: [SqlValue] -> Maybe a
instance FromRow User where
fromRow (id_: other) = case id_ of
SqlInt64 eid -> case other of
(SqlByteString nm : SqlByteString pwd : SqlByteString vn: []) -> case map decodeUtf8' [nm, pwd, vn] of
(Right nm : Right pwd : Right vn: []) -> Just $ User (toInteger eid) nm vn pwd
_ -> Nothing
_ -> Nothing
_ -> Nothing
fromRow _ = Nothing
Unat
текстом читать без перепечатывания тяжелее
Denis
текст редактируется в отличие от скриншотов
Denis
ну и “читабельность” это субъективно
Евгений
Есть http://lpaste.net/
Alexander
fromRow (id_, other) = do
SqlInt64 eid <- Just id_
(SqlByteString nm : SqlByteString pwd : SqlByteString vn: []) <- Just other
Right [nm, pwd, vn] <- pure $ traverse decodeUtf8 [nm, pwd, vn]
pure $ User (toInteger eid) nm vn pwd
Alexander
например так
Alexander
с view patterns можно наверное попроще
Alexander
хотя блин гораздо ж проще
Alexander
fromRow (SqlInt64 eid, [d -> Just nm, d -> Just pwd, d -> Just vn]) = Just $ User eid nm pwd vn where
d (SqlByteString nm) = either (const Nothing) Just $ decodeUtf8' nm
d _ = Nothing
fromRow _ = Nothing
Alexander
вот так например
Alexander
d можно в свою либу куда-нить вытащить, наверняка ведь активно используется
Alexander
это persistent или *-simple с такими ужасными инстансами?
Unat
Да не, это я тыкаю палочкой язык на тупом примере регистрация-авторизация
Unat
Кстати, а как узнать о View Patterns, если ни разу до этого их не трогал?
Leonid 🦇
в *-simple не такой энторфейс
Unat
а, я понял вопрос. Это Database.HDBC
Unat
и класс я вписал сам, посмотреть что получится