Anonymous
Курицу на песочек выпустить, отпечатки лап в OCR и конопелятору скормить
Anonymous
Эффект, глядишь, тот же будет
kosc
Data.Function
А делает он что?
Dmitry
Ну, судя по выдаче гугла, хотя бы графики можно рисовать:
Dmitry
http://abailly.github.io/images/ihaskell.png
Dmitrii
А делает он что?
Это очень обфусцированный способ написать take 5 iterate (*2) 1
kosc
Хм, норм.
Aleksei (astynax)
поэтому всё, что можно пыхтоном, можно чем-угодно другим
вот только у питона есть matplotlib, а у нас только diagrams
Dmitry
Ну вот я про это и спрашиваю
Dmitry
Получается, что надо либы из питона тащщить
Aleksei (astynax)
Нельзя взять и "утащить matplotlib из питона"
kosc
Действительно.
Aleksei (astynax)
Есть либа, которая вызвает питон под капотом и позволяет пользовать matplotlib :)
Aleksei (astynax)
Но scipy, numpy не утащишь
Dmitry
Ну хоть так :)
eahqzsr
Есть SubHask, но...
kosc
А весь список из заранее известного числа элементов можно паттерн матчингом разобрать?
kosc
О, получилось, спс :)
kosc
Да я просто кортеж ставил, а не список.
kosc
Круглые скобки.
kosc
Вот и не компилилось.
kosc
kosc
В следующий раз так и сделаю тогда.
kosc
Хотя смысла особого не вижу, если честно.
Alexander
а какие есть стандартные общеязыковые бенчмарки для сетевых либ?
Alexander
что-нибудь простое, но чем можно реализацию померять адекватно?
Kirill
сетевое, но не http?
Lev
tcpkali
Alexander
http жирно, нужно протокол релизовывать
Alexander
а какой-нибудь броадкаст и много клиентов уже нормально
Vladislav
какой же Хаскель дурной язык (у меня настроение пожаловаться) зачем вот иметь отдельно data Pair a b = P a b data Product f g x = Product (f x) (g x) class (c1, c2) => CPair c1 c2 instance (c1, c2) => CPair c1 c2 class (c1 x, c2 x) => CProduct c1 c2 x instance (c1 x, c2 x) => CProduct c1 c2 x Я еще не придумал, как это должно быть одной и той же штукой, но уверен, что должно.
Kai
Все придумано до нас же data Pair f a b = Pair (Apply f a) (Apply f b) type family Apply (f :: k) a where Apply Id a = a Apply (f :: Type -> Type) a = f a data Id _12 :: Pair Id Int Int _12 = Pair 1 2 ls12 :: Pair [] Int Int ls12 = Pair [1, 2, 3] [9, 8, 7]
Vladislav
Ок, с дефункционализацией identity-функтора нормально. Хотя не нравится, что приходится дефункционализировать, жаль нельзя прямо Pair (\x -> x) написать.
Vladislav
Теперь не хватает constraintiness-полиморфизма, который я когда-то предлагал, а мне сказали чтобы не приставал
Vladislav
в каком-то ghc proposal это было
Vladislav
Нет, погоди, это ведь не то же самое, какой-то жестокий обман
Vladislav
У меня ведь f, g :: Type -> Type и x :: Type, а не f :: Type -> Type и a, b :: Type
Vladislav
Хотя в общем-то понятно, как выразить одно через другое
Vladislav
data With x type instance Apply (With x) f = f x Pair (With x) f g
Vladislav
Можно обобщить это еще на N элементов, получится vinyl
Алексей ayaye :)
а бывает zipWith с дефолтным значением, которое применяется вместо недостающих элементов короткого списка? или это правильнее по-другому делать?
Kirill
дак прицепить repeat def к короткому?
Kirill
или неизвестно который короткий?
A64m
если не известно какой короткий можно к обоим прицепить и takeWhile пока одни дефолтные не полезут
Зигохистоморфный
есть align http://hackage.haskell.org/package/these-0.7.4/docs/Data-Align.html
eahqzsr
http://hackage.haskell.org/package/list-zip-def-0.1.0.1/docs/Data-List-Zip.html
A64m
ну если не хочется по дефолтным определять и как-то их для нормального управления выделять вроде Maybe там, то можно забирать нужное число просто
eahqzsr
Уж проще рекурсивно написать если пакет из hackage религия использовать не позволяет
A64m
ну, в такм случае может и так, но я бы не переоценивал легкость написания и доведения до работоспособного состояния рекурсивной лапши
Ilya
Тут что-то очень похоже на Alternative, надо только придумать для какого типа
A64m
да, но все равно хуже чем комбинаторы комбинировать
eahqzsr
Да, зачем делать просто если можно сложно.
A64m
именно так. комбинировать комбинаторы просто, ПМ и рекурсия - сложно
eahqzsr
Ну скомбинируй
Aliester
пм?
Aliester
прикладная математика?
eahqzsr
паттерн матчинг
IC
Продакт менеджмент
Ilya
пакетный менеджер
кана
а бывает zipWith с дефолтным значением, которое применяется вместо недостающих элементов короткого списка? или это правильнее по-другому делать?
раз zipWith, значит списки разных типов. Раз мы не знаем, какой из списков короче, то не знаем, какого типа требовать дефолт. Значит дефолт - результат операции g :: (a -> b -> c) -> c -> ([a] -> [b] -> [c]) g f d a b = zipWith f a b ++ replicate delta d where delta = abs (length a - length b) h :: (a -> b -> c) -> c -> ([a] -> [b] -> [c]) h _ d [] ys = replicate (length ys) d h _ d xs [] = replicate (length xs) d h f d (x:xs) (y:ys) = f x y : h f d xs ys
кана
по идее ор-паттерны помогут превые два кейса к одному виду свести
кана
ну делать два дефолтных параметра тоже не оч как-то
eahqzsr
Как раз логично
Aleksei (astynax)
Чёт проще в Maybe впаковать, имхо
Aleksei (astynax)
zipWith' f xs ys = catMaybes $ zipWith (liftA2 f) (wrap xs) (wrap ys) where wrap zs = Just <$> zs ++ repeat Nothing
A64m
никогда не остановится же, наверное?
A64m
zipzip def1 def2 f xs ys = map (\(a,b) -> f (fromMaybe def1 a) (fromMaybe def2 b)) . takeWhile (\(a,b) -> not $ null a && null b) $ zip (extend xs) (extend ys) where extend xs = map Just xs ++ repeat Nothing
Ilya
зацените import Prelude hiding (zipWith) import Control.Applicative import Data.Functor zipWith :: (a -> b -> c) -> [a] -> [b] -> [c] zipWith f xs ys = getZipList $ f <$> zxs <*> zys where zxs = ZipList xs zys = ZipList ys zipDefWith :: a -> b -> (a -> b -> c) -> [a] -> [b] -> [c] zipDefWith x y f xs ys = getZipList $ f <$> (zxs <|> zys $> x) <*> (zys <|> zxs $> y) where zxs = ZipList xs zys = ZipList ys
Ilya
для сравнения реализация обычного zipWith
Aleksei (astynax)
никогда не остановится же, наверное?
можно вместо catMaybes сделать takeWhile isJust
Ilya
всё уже реализовано, используйте ZipList :) правда требует base 4.11.0.0