Ilya
Кстати, почему?
Ilya
точно так же как 1 -- перегруженный числовой литерал, который может быть приведен к любому типу с инстансом Num, 1.5 -- это перегруженный дробный (`Fractional`) литерал, который, в свою очередь может быть приведен к любому типа, реализующему Fractional
Ilya
{-# LANGUAGE GeneralizedNewtypeDeriving #-} {-# LANGUAGE StandaloneDeriving #-} import Data.Monoid deriving instance Fractional a => Fractional (Sum a)
Ilya
> 1.5 :: Sum Float Sum {getSum = 1.5}
Cheese
Кстати, почему?
из-за округления моноидные законы могут не выполняться
Алексей
Они выполняются приближённо
Ilya
я подумал об этом, но вроде бы это тут никак не влияет
Ilya
там же Num a => Monoid (Sum a)
Алексей
А сложение флоатов неассоциативно
Ilya
то есть Sum Float и так моноид, без дополнительного инстанса для Fractional (Sum a)
Cheese
я подумал об этом, но вроде бы это тут никак не влияет
а, ну да, это в обратную сторону логика
Ilya
(это не говоря уж о том, что моноидные законы и с переполнением как-то не особо дружат, это же не мешает нам писать `Monoid (Product Int)`)
Cheese
повод расширить стандартную библиотеку
Ilya
Ilya
просто оно ещё и Fractional
Cheese
1.5 Num
ой. я имел в виду, Num не 1.5
Cheese
для 1.5 недостаточно Num
Ilya
не в любой Num влезет 1.5, скажем так 🙂
Leonid 🦇
Я поражаюсь hlint конечно. Прямо приятно что я не один такой тупой, а тупых так много что аж такие вот советы линтер встроены.
Leonid 🦇
почему я сам не догадался написать "m == Just "on" а первое что в голову пришло было maybe False (== "on") m?
Ilya
слишком функционально мыслишь
Cheese
булева слепота
Leonid 🦇
да я вроде недавно был у офтальмолога
Aleksei (astynax)
Вместо "распакуй и сравни" делаю "запакуй эталон до нужной структуры" ;)
Ilya
а на плохой стиль hlint тоже ругается? скажем излишнее увлечение point-less
Ilya
или вот такое, я недавно писал zipWith id [(^2), (^3)] [1, 2]
Timofey
во, кстати. Что всякие стайл-гайды говорят про if..then..else в сравнении с case..of?
Cheese
рыбки это что?
монадный байнд и композиция Кляйсли в разные стороны
Timofey
рыбка - >=>
Leonid 🦇
(<=<) - более правильная
Leonid 🦇
ну а что? Если композишь вперед так пиши просто do
Cheese
во, кстати. Что всякие стайл-гайды говорят про if..then..else в сравнении с case..of?
мой персональный гайд говорит, что case...True...False... надо заменять на if. в остальном они не пересекаются, так что и без гайда всё понятно
Leonid 🦇
if как-то выделяется из остального синтаксиса. глаза режет
Timofey
ладно, а относительно fromMaybe и maybe?
Cheese
вот между и ифом и гардами есть конфликт
A64m
Кстати, почему?
да забыли просто. в каждом релизе обычно какието инстансы базовых классов для базовых типов новые до которых до этого руки не доходили
Leonid 🦇
если со значением под Maybe надо что-то сделать то maybe, если нет то fromMaybe. good = maybe "" show bad = fromMaybe "" . fmap show
Cheese
ладно, а относительно fromMaybe и maybe?
так это тоже разные вещи. fromMaybe x == maybe x id, чтобы заменить второе на первое, достаточно hlint
Timofey
Leonid 🦇
я кстати не обламываюсь делать case для мейби в монадном коде. читается лучше чем join . maybe
Leonid 🦇
case норм
A64m
я и кейс и иф не люблю
Ilya
я и кейс и иф не люблю
потому что композиционный стиль?
Ilya
больше похоже на императивщину
Leonid 🦇
вот такое: good' mx = case mx of Just x -> show x _ -> ""
нет, только если case mx of Nothing -> logMsg "Got nothing" Just v -> do frabulate v logMsg "frabulated"
A64m
потому что композиционный стиль?
потому что в хаскеле два синтаксиса из двух языков эквейшн-стиль как у тернера и экспрешн стиль как в эмелях и второй я недолюбливаю в принципе
eahqzsr
Кстати а есть поинтфри аналог кейса?
A64m
\case
Leonid 🦇
Кстати а есть поинтфри аналог кейса?
деструкторы (деконструкторы). например maybe, either, bool
Ilya
мой персональный гайд говорит, что case...True...False... надо заменять на if. в остальном они не пересекаются, так что и без гайда всё понятно
ну они пересекаются, когда можно матчить с конкретным значением, а можно сравнить с помощью ==. Такое часто встречается, на самом деле.
Ilya
вот тут например явно case пошёл бы лучше, не было бы лесенки https://www.govnokod.ru/6765
кана
тут даже не кейс
кана
а просто гард с elem
Cheese
лучше матчить, чем сравнивать
кана
10 матчей или elem "01234567890."?
кана
даже не так, тут просто chislo = all (`elem` "0123456789.")
Cheese
напоминаю про существование MultiWayIf
Leonid 🦇
0-9 же идут друг за другом в ascii
Leonid 🦇
не говоря уже про Data.Char.isNumber
кана
есть, но там точка еще, проще сделать одну проверку, а не две
A64m
напоминаю про существование MultiWayIf
вообще не припоминаю когда я встречал его использование и встрнчал ли
кана
chislo = all (`elem` '.':['0'..'9'])
Leonid 🦇
foo str = case str of [] -> error "YOLO" '.':xs -> whatever x:xs | isNumber x -> blah | otherwise -> blahblha
Ilya
тут уж не говоря о том, что "1.3..44" это тоже число будет
Leonid 🦇
и да, я считаю что ro-che был прав и case лучше чем несколько тел функции с матчем
Aleksei (astynax)
несколько тел хороши, пока тела однострочные