Size: a a a

2021 December 11

AP

Aleksei (astynax) Pi... in Haskell Start
Если привлечь Bifunctor, то можно побаловаться

import Data.List (break)
import Data.Bifunctor (bimap)

unlessNull _ [] = []
unlessNull f xs = f xs

untilDoThen cond l r = unlessNull (uncurry (<>) . bimap l r . break cond)

reverseWords = untilDoThen isSpace         reverse keepSpaces
keepSpaces   = untilDoThen (not . isSpace) id      reverseWords


тоже работает, само собой

> reverseWords "asd  123    456"
"dsa  321    654"
источник

A

Aragaer in Haskell Start
revwords_ r w "" = r ++ w
revwords_ r w (' ':s) = revwords_ (r ++ w ++ " ") "" s
revwords_ r w (x:s) = revwords_ r (x:w) s

revwords = revwords_ "" ""
источник

A

Aragaer in Haskell Start
вроде проще 8)
источник

A

Aragaer in Haskell Start
но да, надо isSpace использовать вместо явного пробела
источник

AP

Aleksei (astynax) Pi... in Haskell Start
Явная рекурсия никогда не проще :)
источник

AP

Aleksei (astynax) Pi... in Haskell Start
Тут идеально break ложится
источник

AP

Aleksei (astynax) Pi... in Haskell Start
Или хотя бы стоит разбить рекурсивную фуникцию на две. Потому что тут явно два режима "копим слово" и "копим пробелы"
источник

A

Aragaer in Haskell Start
тут явная хвостовая рекурсия, оно по сути как если бы я по одному символу просто в цикле шел
источник

A

Aragaer in Haskell Start
и да, не два режима, а "на каждом пробеле сбрасываю весь буфер"
источник

A

Aragaer in Haskell Start
потому что если он пустой, то все ок
источник

AP

Aleksei (astynax) Pi... in Haskell Start
два! Потому что пробелы нужно копить тоже
источник

A

Aragaer in Haskell Start
зачем их копить? их можно сразу в выходной класть
источник

AP

Aleksei (astynax) Pi... in Haskell Start
Потому что дорого дописывать в конец по пробелу, не?
источник

AP

Aleksei (astynax) Pi... in Haskell Start
(r ++ w ++ " ") — вот это вот
источник

A

Aragaer in Haskell Start
если бы вместо списка была какая-нибудь дека, то проще, да
источник

AP

Aleksei (astynax) Pi... in Haskell Start
Да хотя бы concat сделать в конце, а в рекурсии список собирать — уже будет и читаться проще и работать быстрее
источник

AP

Aleksei (astynax) Pi... in Haskell Start
А делать нарочито "явную хвостовую" ценой конкатенации в конец — такое себе, ИМХО :Р
источник

ХГ

Хаскелль Моисеевич Г... in Haskell Start
В Слоне утверждается, что такое работает:
reverseWords :: String -> String
reverseWords = unwords . map reverse . words
источник

ХГ

Хаскелль Моисеевич Г... in Haskell Start
the goat of error shines a light upon your life
eht taog fo rorre senihs a thgil nopu ruoy efil
it was all a dream
ti saw lla a maerd
источник

AP

Aleksei (astynax) Pi... in Haskell Start
Не читаем, но пишем?
источник