Size: a a a

2020 November 22

к

кана in Haskell Start
это будет семантически я так понял то что в скале
источник

АК

Анатолий Кот... in Haskell Start
кана
с lens

data Foo = A | B String | C Int
makePrisms ''Foo

f :: [A] -> Int
f = sumOf (each . _C)


или c generic-lens

data Foo = A | B String | C Int
 deriving stock Generic

f :: [A] -> Int
f = sumOf (each . #_C)


ну или
sum (lst ^.. each . _C)

я бы так сделал в этом случае
прикольно, но я думал может что стандартное есть.
но если нет - не страшно, допишу _ ->  руками
источник

к

кана in Haskell Start
линзы имхо можно вполне считать чем-то стандартным, избегание этого только вредит
источник

Oℕ

Oleg ℕizhnik in Haskell Start
линзы это почти стандарт, правда не уверен, считаются ли каноном женерики
источник

JS

Jerzy Syrowiecki in Haskell Start
Анатолий Кот
Добрый вечер, в хаскеле есть что-то вроде collect из скалы?
Ну или как проще всего такое сворачивать?
data Foo = A | B String | C Int
lst = [A, B "blah", C 3, ..]
collectLike (\acc (C i) -> acc + i)) 0 lst
sum [i | C i <- lst]
источник

JS

Jerzy Syrowiecki in Haskell Start
не совсем collect, но ближе, чем призмы
источник

JS

Jerzy Syrowiecki in Haskell Start
компрехеншен пропускает неудачные паттернматчи
источник

D

Dmitry in Haskell Start
кана
линзы имхо можно вполне считать чем-то стандартным, избегание этого только вредит
Я не избегаю. Просто не использую - не нужно.
источник

АК

Анатолий Кот... in Haskell Start
Jerzy Syrowiecki
sum [i | C i <- lst]
во, такое хорошо подходит, спасибо
источник
2020 November 23

AT

Alexander T in Haskell Start
нужна подсказка по созданию бесконечной последовательности.
на входе дается строка s и символ b. последовательность строится по правилу: s ++ s ++ [b], где s каждый раз - результат предыдущего применения алгоритма.
при s = abc и b = d:
abc =>
abcabcd =>
abcabcdabcabcdd =>
abcabcdabcabcddabcabcdabcabcddd => …
full :: [a] -> a -> [a]
full s b = full construct b
 where construct = s ++ s ++ [b]

у меня то зацикливается, то неправильно строит, не пойму, как это сделать.
источник

к

кана in Haskell Start
потому что ты вызываешь full сразу в full. чтобы не зацикдивалось, нужно возвращать конструктор, один из аргументов которого уходит в рекурсию, чтобы этот конструктор потребился
источник

AT

Alexander T in Haskell Start
construct ++ full construct b пробовал, но неправильно строит последовательность.
источник

AT

Alexander T in Haskell Start
понимаю, почему неправильно строит, не понимаю, как сделать правильно
источник

к

кана in Haskell Start
вот у нас уже вернулась строка s
значит на следующем цикле нужно только один раз вывести еще раз s
вывести b
и перейти к следующему этапу со всей строкой
источник

к

кана in Haskell Start
f s b = s <> go s
 where
   go s = s <> [b] <> go (s <> s <> [b])

x = take 100 $ f "abc" 'd'

вроде работает
источник

AT

Alexander T in Haskell Start
кана
f s b = s <> go s
 where
   go s = s <> [b] <> go (s <> s <> [b])

x = take 100 $ f "abc" 'd'

вроде работает
ага, я не не догадался написать рекурсию во вспомогательной функции. вроде работает. спасибо!
источник

СС

Станислав Смирнов... in Haskell Start
Вроде так без вспомогательной функции работает:
f s b = s : f (s++b) b
источник

СС

Станислав Смирнов... in Haskell Start
А, не то
источник

СС

Станислав Смирнов... in Haskell Start
Вот так:
f s b = s : f (s++s++b) b
источник

к

кана in Haskell Start
1. f s b = s <> f (s <> s <> [b]) b
s - строка а не символ, а b это символ а не строка
2. не работает таки
источник