@haskellru

Страница 1337 из 1551
Ilya
13.07.2018
13:54:28
A64m
13.07.2018
13:54:38
да, но все равно хуже чем комбинаторы комбинировать

shadowjack
13.07.2018
13:58:35
Да, зачем делать просто если можно сложно.

A64m
13.07.2018
14:04:25
именно так. комбинировать комбинаторы просто, ПМ и рекурсия - сложно

Google
shadowjack
13.07.2018
14:04:57
Ну скомбинируй

Alister
13.07.2018
14:05:05
пм?

прикладная математика?

shadowjack
13.07.2018
14:06:16
паттерн матчинг

IC
13.07.2018
14:35:51
Продакт менеджмент

Ilya
13.07.2018
14:36:07
пакетный менеджер

kana
13.07.2018
14:37:38
а бывает 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

по идее ор-паттерны помогут превые два кейса к одному виду свести

kana
13.07.2018
14:43:35
ну делать два дефолтных параметра тоже не оч как-то

shadowjack
13.07.2018
14:44:05
Как раз логично

Google
Aleksey
13.07.2018
14:50:16
Чёт проще в Maybe впаковать, имхо

zipWith' f xs ys = catMaybes $ zipWith (liftA2 f) (wrap xs) (wrap ys) where wrap zs = Just <$> zs ++ repeat Nothing

A64m
13.07.2018
14:53:32
никогда не остановится же, наверное?

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
13.07.2018
14:55:19
зацените 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

для сравнения реализация обычного zipWith

Aleksey
13.07.2018
14:56:57
никогда не остановится же, наверное?
можно вместо catMaybes сделать takeWhile isJust

Ilya
13.07.2018
14:57:17
всё уже реализовано, используйте ZipList :) правда требует base 4.11.0.0

Aleksey
13.07.2018
14:57:31
zipWith' f xs ys = takeWhile isJust $ zipWith (liftA2 f) (wrap xs) (wrap ys) where wrap zs = Just <$> zs ++ repeat Nothing

Так. Походу у меня обычный zipWith получился :)

Кароч, нужно просто зипать через Maybe a -> Maybe b -> Maybe c и будет нормально - контроль над остановом, вот это всё: zipWith' f xs ys = takeWhile isJust $ zipWith f (wrap xs) (wrap ys) where wrap zs = Just <$> zs ++ repeat Nothing

Алексей Ayaye :)
13.07.2018
15:01:04
A64m
13.07.2018
15:01:28
инстанс Alternative для ZipList появился. раньше такого не было

Ilya
13.07.2018
15:05:06
и как это поможет?
ну я выше же привёл код

A64m
13.07.2018
15:06:11
да, комбинаторный парсер (инстансы апликатив и альтернатив) как обычно не победить

kana
13.07.2018
15:55:26
когда только знакомился с хаскелем, долго мучала идея, как сделать псевдогетерогенный список, где элементы чередуются единственная идея, которая тогда пришла - делать специальные отдельные списки, где не 2 конструктора, а типа: data IntAndStringList = Nil | PartCons Int | Cons Int String IntAndStringList

сейчас вспомнил о задаче (из-за другой книги, где рассказывается про индукцию как рекурсию, параметризованую значениями элементов, зависимую то есть) и пришла идея просто параметризовать тип каждого элемента индексом (от 0, если от 1, то Cons :: a (Succ n) ->)



Google
Ilya
13.07.2018
16:01:29
а какая задача? сделать типа список, где могут лежать элементы двух разных типов, причём строго по очереди?

kana
13.07.2018
16:01:45
"сделать псевдогетерогенный список, где элементы чередуются"

да

Ilya
13.07.2018
16:02:16
интересно

shadowjack
13.07.2018
16:02:25
А доставать как?

Timofey
13.07.2018
16:03:14
А чем проще всего собрать лог работы приложения и выгрузить в конце в файлик?

kana
13.07.2018
16:03:21
ща попробую написать индуктивный элиминатор

Ilya
13.07.2018
16:04:05
@kana_sama a у тебя список может начинаться с любого из типов?

или только с одного из двух

kana
13.07.2018
16:04:49
@kana_sama a у тебя список может начинаться с любого из типов?
тип элемента задается семейством, в данном случае в семействе задали, что IntString 0 = Int

Ilya
13.07.2018
16:05:00
нет, я про исходную задачу

решение с семействами не смотрел, хочу что-нибудь своё пока придумать:)

kana
13.07.2018
16:05:41
в исходной задаче не было конкретной формулировки, она спонтанно родилась и забылась будем считать, что первый элемент статичен

Ilya
13.07.2018
16:06:20
а, ок

просто тип выглядел несимметричным

kana
13.07.2018
16:10:59
А доставать как?
похоже с семейством никак, нужно использовать gadt-ы

Google
kana
13.07.2018
16:11:50
потому что я не могу сматчить IntegerString n



Ilya
13.07.2018
16:16:44
тип example обязательно вручную писать?

kana
13.07.2018
16:16:50
нет, выведется

Admin
ERROR: S client not available

Ilya
13.07.2018
16:21:13
то есть ради чего усложняем?

kana
13.07.2018
16:21:16
необобщенность

можно обобщить по двум типам, но если мы захотим чередование по 3?

а потом по 4

kana
13.07.2018
16:22:40
в новом решении есть общий DVector, а сколько и как (там может быть и не чередование, а другая комплексная логика, например вектор из векторов такой же длины, чтобы такой треугольник получился) - решает клиент

Ilya
13.07.2018
16:25:50
Ох уж эти клиенты:))

Yuriy
13.07.2018
16:57:02
@kana_sama data Rope a b = Nil | a :. Rope b a

kana
13.07.2018
17:25:51
@kana_sama data Rope a b = Nil | a :. Rope b a
тут чередование только двух элементов

для трех придется писать новый тип

наверное можно через семейство по тайплевел спискам обобщить до N типов

но выглядит красиво конечно, намного лучше того моего



Google
kana
13.07.2018
20:45:42
обобщить бы как-нибудь до List, чтобы Rope '[] стало Void



Alexander
13.07.2018
20:51:17
а зачем так?

у шифта можно '[] не делать

kana
13.07.2018
20:52:35
чтобы его элиминировать, нужно делать какую-то n+1 арную функцию, где n - длина списка, на тайпклассах

Alexander
13.07.2018
20:52:39
тогда Rope '[] только Nil, хотя оно и так

там unary tuple вроде подвезут

так меня можно игнорировать

kana
13.07.2018
20:55:35
у шифта можно '[] не делать
да, в принципе и у head [] можно не делать, что позволит обобщить head до k

я так понимаю, неопределенный кейс семейства - то же самое, что и void

раньше я думал, что не скомпилируется

type family Head (as :: [k]) :: k where Head (a : as) = a y :: Head '[] y = undefined

Alexander
13.07.2018
21:03:32
интересно а. можно ли обощить, б. можно ли без GADT

обощить наверное можно щас попробую

Yuriy
13.07.2018
21:08:10
type family Head (as :: [k]) :: k where Head (a : as) = a y :: Head '[] y = undefined
чтобы этого избегать, придумали TypeError

Alexander
13.07.2018
21:13:43
почему я всегда забываю хак с частичным примерением TF

kana
13.07.2018
21:25:44


Страница 1337 из 1551