
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
по идее ор-паттерны помогут превые два кейса к одному виду свести

shadowjack
13.07.2018
14:43:00

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

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

Алексей Ayaye :)
13.07.2018
14:47:00

shadowjack
13.07.2018
14:48:22

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

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 появился. раньше такого не было

Denis
13.07.2018
15:04:55

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

Ilya
13.07.2018
16:05:00
нет, я про исходную задачу
решение с семействами не смотрел, хочу что-нибудь своё пока придумать:)

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

Ilya
13.07.2018
16:05:43

kana
13.07.2018
16:06:02
Cons 1 "2" Nil

Ilya
13.07.2018
16:06:20
а, ок
просто тип выглядел несимметричным

kana
13.07.2018
16:10:59

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
нет, выведется

Ilya
13.07.2018
16:17:05
отлично тогда

Admin
ERROR: S client not available

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

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

Ilya
13.07.2018
16:21:58

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
для трех придется писать новый тип
наверное можно через семейство по тайплевел спискам обобщить до 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
я так понимаю, неопределенный кейс семейства - то же самое, что и 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

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

Yuriy
13.07.2018
21:18:10

kana
13.07.2018
21:25:44