Anonymous
Курицу на песочек выпустить, отпечатки лап в OCR и конопелятору скормить
Anonymous
Эффект, глядишь, тот же будет
Dmitry
Ну, судя по выдаче гугла, хотя бы графики можно рисовать:
Dmitry
http://abailly.github.io/images/ihaskell.png
Dmitrii
А делает он что?
Это очень обфусцированный способ написать take 5 iterate (*2) 1
kosc
Хм, норм.
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
eahqzsr
A64m
ну если не хочется по дефолтным определять и как-то их для нормального управления выделять вроде Maybe там, то можно забирать нужное число просто
eahqzsr
Уж проще рекурсивно написать если пакет из hackage религия использовать не позволяет
A64m
ну, в такм случае может и так, но я бы не переоценивал легкость написания и доведения до работоспособного состояния рекурсивной лапши
Ilya
Тут что-то очень похоже на Alternative, надо только придумать для какого типа
eahqzsr
Ilya
A64m
да, но все равно хуже чем комбинаторы комбинировать
eahqzsr
Да, зачем делать просто если можно сложно.
A64m
именно так. комбинировать комбинаторы просто, ПМ и рекурсия - сложно
eahqzsr
Ну скомбинируй
Aliester
пм?
Aliester
прикладная математика?
eahqzsr
паттерн матчинг
IC
Продакт менеджмент
Ilya
пакетный менеджер
кана
по идее ор-паттерны помогут превые два кейса к одному виду свести
eahqzsr
кана
ну делать два дефолтных параметра тоже не оч как-то
eahqzsr
Как раз логично
Алексей ayaye :)
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
Ilya
Ilya
всё уже реализовано, используйте ZipList :)
правда требует base 4.11.0.0