Size: a a a

2020 July 08

JS

Jerzy Syrowiecki in Haskell
если поток — это String, то записать его в переменную — это

savedStream = originalStream
источник

АБ

Александр Бантьев... in Haskell
Если его выводит сторонняя команда с помощью createProcess или что-то в таком духе, то лови вывод с помощью этого самого createProcess
источник

PL

Paul Lemon in Haskell
splitTranslation :: String -> [String]
splitTranslation string = do
   let withoutSemicolumn = replace (pack ";") (pack "") (pack string)
   let splited = splitOn (pack ", ") withoutSemicolumn
   map unpack splited

containTranslation :: String -> String -> String -> IO String
containTranslation word phrase translation = do
   text <- capture_ $ parse $ drop (length phrase + 1) translation
   let russianWords = filter (\a -> a =~ regexp ("^[^\\(].*[ёа-яА-Я].*")) (lines text)
   let words = concat $ map splitTranslation russianWords
   if any (== word) words
   then return $ phrase
   else return $ ""


filterTranslations :: String -> [String] -> [String] -> IO()
filterTranslations word list dictionary = do
   let translationArray = filter (\a -> a =~ regexp ("^.*" ++ word ++ ".*$")) dictionary
   let indexArray = map (\a -> fromJust $ elemIndex a dictionary) translationArray
   stringArray <- sequence $ map (\i -> containTranslation word (list !! i) (dictionary !! i)) indexArray
   putStrLn $ mconcat $ intersperse ", " $ filter (( /= 0) . length) stringArray
источник

PL

Paul Lemon in Haskell
Вот так оно работает как надо.
источник

АБ

Александр Бантьев... in Haskell
Paul Lemon
splitTranslation :: String -> [String]
splitTranslation string = do
   let withoutSemicolumn = replace (pack ";") (pack "") (pack string)
   let splited = splitOn (pack ", ") withoutSemicolumn
   map unpack splited

containTranslation :: String -> String -> String -> IO String
containTranslation word phrase translation = do
   text <- capture_ $ parse $ drop (length phrase + 1) translation
   let russianWords = filter (\a -> a =~ regexp ("^[^\\(].*[ёа-яА-Я].*")) (lines text)
   let words = concat $ map splitTranslation russianWords
   if any (== word) words
   then return $ phrase
   else return $ ""


filterTranslations :: String -> [String] -> [String] -> IO()
filterTranslations word list dictionary = do
   let translationArray = filter (\a -> a =~ regexp ("^.*" ++ word ++ ".*$")) dictionary
   let indexArray = map (\a -> fromJust $ elemIndex a dictionary) translationArray
   stringArray <- sequence $ map (\i -> containTranslation word (list !! i) (dictionary !! i)) indexArray
   putStrLn $ mconcat $ intersperse ", " $ filter (( /= 0) . length) stringArray
Зачем тебе вообще там IO String, если ты возвращаешь либо аргумент, либо пустую строку?
источник

PL

Paul Lemon in Haskell
text <- capture_ $ parse $ drop (length phrase + 1) translation
источник

PL

Paul Lemon in Haskell
Вот из-за этого вот.
источник

АБ

Александр Бантьев... in Haskell
Ну так возвращай просто IO Bool
источник

АБ

Александр Бантьев... in Haskell
Paul Lemon
text <- capture_ $ parse $ drop (length phrase + 1) translation
Или вообще вынеси вот эту часть в отдельный IO, а логику обработки результата -- в чистую функцию
источник

֍֎

֍ ֎ in Haskell
Paul Lemon
text <- capture_ $ parse $ drop (length phrase + 1) translation
источник

V

Vladimir in Haskell
Paul Lemon
А как превратить его в список String?
...
do
 eitherStrings <- sequence listOfIOEitherStrings

С этого можешь начать
источник

PL

Paul Lemon in Haskell
источник

֍֎

֍ ֎ in Haskell
А что за parse?
источник

PL

Paul Lemon in Haskell
֍ ֎
А что за parse?
Реализованная функция, парсит содержимое в файле
источник

֍֎

֍ ֎ in Haskell
Paul Lemon
Реализованная функция, парсит содержимое в файле
И выводит в stdout результат?
источник

PL

Paul Lemon in Haskell
֍ ֎
И выводит в stdout результат?
Да
источник

֍֎

֍ ֎ in Haskell
И переписать ее нельзя?
источник

АБ

Александр Бантьев... in Haskell
Наивная переделка:

splitTranslation :: String -> [String]
splitTranslation string = map unpack splited
 where
   withoutSemicolon = replace (pack ";") (pack "") (pack string)
   splited = splitOn (pack ", ") withoutSemicolon

getText :: String -> IO String
getText translation = capture_ $ parse $ drop (length phrase + 1) translation


containTranslation :: String -> String -> String -> Maybe String
containTranslation word phrase text = if any (== word) words then Just phrase else Nothing
   where
     russianWords = filter (\a -> a =~ regexp ("^[^\\(].*[ёа-яА-Я].*")) (lines text)
     words = concat $ map splitTranslation russianWords


filterTranslations :: String -> [String] -> [String] -> IO()
filterTranslations word list dictionary = do
   let translationArray = filter (\a -> a =~ regexp ("^.*" ++ word ++ ".*$")) dictionary
   let indexArray = map (\a -> fromJust $ elemIndex a dictionary) translationArray
   maybeArray <- sequence $ map (\i -> containTranslation word (list !! i) (dictionary !! i)) $ getText <$> indexArray
   putStrLn $ mconcat $ intersperse ", " $ catMaybes maybeArray
источник

PL

Paul Lemon in Haskell
Спасибо.
источник
2020 July 09

LO

Leonid 🦇 Onokhov in Haskell
Да
источник