Size: a a a

2021 January 16

к

кана in Haskell Start
Jerzy Syrowiecki
intercalate
Prelude Data.List> f xs = intercalate ", " (init xs) <> " and " <> last xs
Prelude Data.List> f ["a", "b", "c"]
"a, b and c"
источник

JS

Jerzy Syrowiecki in Haskell Start
Rafael
Чем что? Как ещё?
intercalate, я же выше написал
источник

к

кана in Haskell Start
reverse не нужен, потому что есть last, если я правильно понял намерения
источник

JS

Jerzy Syrowiecki in Haskell Start
а, там ещё хуже
источник

к

кана in Haskell Start
кана
Prelude Data.List> f xs = intercalate ", " (init xs) <> " and " <> last xs
Prelude Data.List> f ["a", "b", "c"]
"a, b and c"
для пустого списка еще желательно отдельный кейс
источник

JS

Jerzy Syrowiecki in Haskell Start
кана
Prelude Data.List> f xs = intercalate ", " (init xs) <> " and " <> last xs
Prelude Data.List> f ["a", "b", "c"]
"a, b and c"
давайте не решать учебные задания за других, а то они не научатся ничему
источник

R

Rafael in Haskell Start
кана
Prelude Data.List> f xs = intercalate ", " (init xs) <> " and " <> last xs
Prelude Data.List> f ["a", "b", "c"]
"a, b and c"
Да, спасибо) И сделать ещё проверку на кол-во элементов в списке? 🤔
источник

JS

Jerzy Syrowiecki in Haskell Start
Rafael
Да, спасибо) И сделать ещё проверку на кол-во элементов в списке? 🤔
нет, не нужна проверка на количество
источник

к

кана in Haskell Start
а какую именно проверку?


f xs | length xs == n = ...

если на 0, то

f [] = ...
f xs = ...
источник

R

Rafael in Haskell Start
Jerzy Syrowiecki
нет, не нужна проверка на количество
last [] - упадёт же
источник

JS

Jerzy Syrowiecki in Haskell Start
Rafael
last [] - упадёт же
значит, проверка на пустоту нужна
источник

к

кана in Haskell Start
Jerzy Syrowiecki
давайте не решать учебные задания за других, а то они не научатся ничему
примеры - тоже хороший способ обучения, если их миксовать с практикой. Чисто практика или чисто примеры имхо хуже, чем микс
источник

R

Rafael in Haskell Start
кана
примеры - тоже хороший способ обучения, если их миксовать с практикой. Чисто практика или чисто примеры имхо хуже, чем микс
+, не знал про функцию init, поэтому думал делать reverse, поэтому хотел сделать Ord. Такое короче :)
источник

к

кана in Haskell Start
для reverse не нужен Ord кстати
источник

R

Rafael in Haskell Start
А, да, там в другом месте проблема была
источник

AY

Andrei Yangabishev in Haskell Start
Если я внутри монады Reader, я могу прокинуть её внутрь foldr? Мне нужно добавить префикс к строкам в списке, префикс передается через Reader-монаду, не хочется в foo еще раз вытаскивать префикс и внутри foldr перезапускать Reader монаду через runReader

bar :: String -> Reader String String
bar p = do
   prefix <- ask
   return $ prefix ++ p

foo :: Reader String String
foo = do
   return $ foldr (\a b -> (bar a) ++ b) [] ["1"]
источник

ЗП

Зигохистоморфный Пре... in Haskell Start
Andrei Yangabishev
Если я внутри монады Reader, я могу прокинуть её внутрь foldr? Мне нужно добавить префикс к строкам в списке, префикс передается через Reader-монаду, не хочется в foo еще раз вытаскивать префикс и внутри foldr перезапускать Reader монаду через runReader

bar :: String -> Reader String String
bar p = do
   prefix <- ask
   return $ prefix ++ p

foo :: Reader String String
foo = do
   return $ foldr (\a b -> (bar a) ++ b) [] ["1"]
foldrM?
источник

AY

Andrei Yangabishev in Haskell Start
о, ща посмотрим
источник

к

кана in Haskell Start
Andrei Yangabishev
Если я внутри монады Reader, я могу прокинуть её внутрь foldr? Мне нужно добавить префикс к строкам в списке, префикс передается через Reader-монаду, не хочется в foo еще раз вытаскивать префикс и внутри foldr перезапускать Reader монаду через runReader

bar :: String -> Reader String String
bar p = do
   prefix <- ask
   return $ prefix ++ p

foo :: Reader String String
foo = do
   return $ foldr (\a b -> (bar a) ++ b) [] ["1"]
но чтобы понять решение foldrM, вот реалзиация через просто foldr

foo :: Reader String String
foo =
 foldr
   ( \a b -> do
       a' <- bar a
       b' <- b
       pure (a' <> b')
   )
   (pure "")
   ["1", "2", "3"]

foo' :: Reader String String
foo' =
 foldr
   ( \a b ->
       bar a >>= \a' ->
         b >>= \b' ->
           pure (a' <> b')
   )
   (pure "")
   ["1", "2", "3"]
источник

к

кана in Haskell Start
не нужно ничего прокидывать, можно просто сворачивать в Reader сразу
источник