Форум программистов, компьютерный форум, киберфорум
Haskell
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
1 / 1 / 2
Регистрация: 23.09.2014
Сообщений: 72

Не опознаёт строки

28.12.2015, 18:11. Показов 864. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, считываю данные с консоли и передаю их в case, но даже при нужной строке , оператор переводит на дефолтную линию обработки.В чём проблема?

Haskell
1
2
3
4
5
6
7
8
9
10
11
main :: IO ()
main = do
      str <- getLine
      commandController str
 
commandController :: String -> IO ()
commandController str = do
                let firsArg =toLower $ head $ split (==' ') $ pack str in
                       case (firsArg) of
                       "!list" -> putStrLn "List of commands:"
                        _ -> putStrLn "Wrong command. Try again"
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
28.12.2015, 18:11
Ответы с готовыми решениями:

Не опознает usb
Здравствуйте. У меня при подключении телефона через usb к компьютеру стала вылетать ошибка &quot;Неизвестное устройство. Невозможно...

Не опознает сеть
Здравствуйте, у меня такая проблема, был модем йота, к нему был куплен специальный роутер, все работало хорошо , до сегодняшнего дня. Я...

Не опознает переменную
Доброго времени суток! Народ возникла такая проблема (где то туплю) выдает ошибку Notice: Undefined variable: b in...

10
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38178 / 21113 / 4307
Регистрация: 12.02.2012
Сообщений: 34,716
Записей в блоге: 14
28.12.2015, 19:08
Как я понял, нужно разбить введенную строку на слова? Зачем же так сложно? Есть простая функция

Haskell
1
words :: String -> [String]
тогда:

Haskell
1
  let firsArg =toLower $ head $ words str in -- и т.д.
1
Модератор
 Аватар для Curry
5158 / 3484 / 536
Регистрация: 01.06.2013
Сообщений: 7,557
Записей в блоге: 9
28.12.2015, 19:19
Alex2671, Я предполагаю что у Вас в начале программы
Haskell
1
2
3
4
{-# LANGUAGE OverloadedStrings #-}
--module Main where
 
import Data.Text hiding (head)
Но, у меня тогда работает.
*Main> :r
[1 of 1] Compiling Main
Ok, modules loaded: Main.
*Main> :main
!list
List of commands:
*Main> :main
!LIST
List of commands:
*Main>
Цитата Сообщение от Catstail Посмотреть сообщение
тогда:
Если не переводить из String в Text, то потребуется перед toLower вставить map.
А так то, да. замена на words напрашивается. Хоть для String, хоть для Text.
1
 Аватар для NoobsEnslaver
136 / 48 / 2
Регистрация: 31.07.2014
Сообщений: 238
29.12.2015, 07:36
Советую также не мешать чистое с нечистым по-возможности. В вашем примере нет никакой нужды вносить побочный эффект внутрь функции:
Haskell
1
2
3
4
5
6
7
8
9
10
main = do
      str <- getLine
      putStrLn$ if null str then "Empty string!" 
                else  commandController str
      main
 
commandController str = let firstArg = toLower $ head $ words $ pack str in
                        case (firsArg) of
                        "!list" -> "List of commands:"
                         _ -> "Wrong command. Try again"
3
1 / 1 / 2
Регистрация: 23.09.2014
Сообщений: 72
29.12.2015, 17:13  [ТС]
Странно, но не один из предложенных способов не заработал. Путём махинаций вывел в переменную и всё чудом вывелось. ??????

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
module CommandsControls
where
import System.Environment
import Control.Concurrent
import Data.Text (split,pack, toLower,words)
 
main :: IO ()
main = do
    putStrLn "Enter your Name"
    login <- getLine
    putStrLn $ "Welcome " ++ login
    putStrLn "Enter some command! List of commands - !List"
    commands <- getLine
    putStrLn $ if null commands then "Empty string!" 
                else  commandController commands
    main
    
 
    sr = "list" :: String
 
commandController comm = let firsArg =  show $ head $ Data.Text.words $ pack comm in
    case (firsArg) of 
         sr -> "!Connect hostname port - connect to channel"            
                     ++ "!Host port - start your channel"
                     ++  "!q - exiting"
Так ведь не должно быть?
0
 Аватар для NoobsEnslaver
136 / 48 / 2
Регистрация: 31.07.2014
Сообщений: 238
29.12.2015, 17:50
Я думаю система не может вывести тип твоих строк, а когда ты указал "list"::String явно - всё заработало. Поможет явное указание типа функции commandController, я так понимаю тип будет String->Text
0
Модератор
 Аватар для Curry
5158 / 3484 / 536
Регистрация: 01.06.2013
Сообщений: 7,557
Записей в блоге: 9
29.12.2015, 18:22
Цитата Сообщение от Alex2671 Посмотреть сообщение
Путём махинаций вывел в переменную и всё чудом вывелось.
Крутые махинации, особенно если учесть, что в Haskell нет переменных.
Что вывелось? На ввод любой непустой строки через второй getLine будет выведено одно и тоже сообщение (у Вас в стр 23-25). sr из строки 19 не используется. В строке 23 новая sr.
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import Data.Text (split,pack, unpack, toLower,words)
 
main :: IO ()
main = do
    putStrLn "Enter your Name"
    login <- getLine
    putStrLn $ "Welcome " ++ login
    putStrLn "Enter some command! List of commands - !List"
    commands <- getLine
    putStrLn $ if null commands then "Empty string!"
                else  commandController commands
    main
 
commandController:: String -> String
commandController comm = let firsArg = unpack $ toLower $ head $ Data.Text.words $ pack comm in
    case firsArg of
         "!list" -> "You wrote "!list""
         s -> "You wrote : " ++ s ++ ", not "!list""
А можно без Text, на одних String
Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import Data.Char (toLower)
 
main :: IO ()
main = do
    putStrLn "Enter your Name"
    login <- getLine
    putStrLn $ "Welcome " ++ login
    putStrLn "Enter some command! List of commands - !List"
    commands <- getLine
    putStrLn $ if null commands then "Empty string!"
                else  commandController commands
    main
 
commandController:: String -> String
commandController comm = let firsArg = map toLower $ head $ words comm in
    case firsArg of
         "!list" -> "You wrote "!list""
         s -> "You wrote : " ++ s ++ ", not "!list""
Добавлено через 10 минут
Кстати, у меня были обратные слеши перед двойными кавычками, обрамляющими !list в конце строк 17,18.
Куда они делись?
1
1 / 1 / 2
Регистрация: 23.09.2014
Сообщений: 72
29.12.2015, 18:25  [ТС]
хм, а почему вы использовали unpack, а не show для конвертирования в строку?
0
Модератор
 Аватар для Curry
5158 / 3484 / 536
Регистрация: 01.06.2013
Сообщений: 7,557
Записей в блоге: 9
29.12.2015, 18:32
p.s. понял. Обратный слеш повторять надо при вставке сообщения: Т.е. последнии строки должны быть
Haskell
1
2
         "!list" -> "You wrote \"!list\""
         s -> "You wrote : " ++ s ++ ", not \"!list\""
Добавлено через 5 минут
Цитата Сообщение от Alex2671 Посмотреть сообщение
почему вы использовали unpack, а не show
Что бы меня компилятор лучше контролировал. show разные бывают, а unpack, если подключен только import Data.Text только unpack :: Text -> String.
0
 Аватар для NoobsEnslaver
136 / 48 / 2
Регистрация: 31.07.2014
Сообщений: 238
29.12.2015, 19:06
Если интересно - посмотри как я сделал парсилку аргументов, тут другой подход
Кликните здесь для просмотра всего текста

Haskell
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
import System.Environment
import Data.Binary
import Data.List
import qualified Data.ByteString.Lazy as L
import qualified Data.Text as T
 
data Command = FileCMD FilePath Mode | HelpCMD | ErrorCMD String
data Mode = CheckSumMode | FindMode String
 
main::IO()
main = do
  args <- getArgs
  msg <- case parseArgs args of
    ErrorCMD msg -> return msg
    HelpCMD -> return helpMsg
    FileCMD path mode -> case mode of
      CheckSumMode -> calculateSumInFile path
      FindMode word-> takePositionsOfWordFromFile path word
  putStrLn msg
 
 
parseArgs::[String]-> Command
parseArgs args@(m1:str1:m2:str2:m3:str3:tail)
  | "-f" == m1 && "-m" == m2 && "-s" == m3 = case str2 of "find"-> FileCMD str1 (FindMode str3)
                                                          "checksum"-> FileCMD str1 CheckSumMode
                                                          otherwise->ErrorCMD "Unknown mode"
  | "-h" `elem` args = HelpCMD
  | otherwise = ErrorCMD "Not enought arguments"                
parseArgs args@(m1:str1:m2:str2:tail)
  | "-f" == m1 && "-m" == m2 = case str2 of "find"-> ErrorCMD "No word to search"
                                            "checksum"-> FileCMD str1 CheckSumMode
                                            otherwise->ErrorCMD "Unknown mode"
  | "-h" `elem` args = HelpCMD
  | otherwise = ErrorCMD "Not enought arguments"                
parseArgs (m1:tail)
  | m1 == "-h" = HelpCMD
  | m1 == "-f" = ErrorCMD "Not enought arguments"
  | otherwise = ErrorCMD "Unknown command"                
parseArgs _ = ErrorCMD "Error parse arguments"
 
 
calculateSumInFile:: FilePath->IO String
calculateSumInFile path = do
  bytes <- L.readFile path
  return$ show (groupBytesBy4 bytes 0)
  where groupBytesBy4 x acc | L.length x < 4 = acc    --not "null" because unexpected behavior of L.splitAt
                            | otherwise = groupBytesBy4 bTail ((decode num ::Word32) + acc)
          where (num, bTail)= L.splitAt 4 x  -- throw exception when length x == 0
                                             -- maybe because in 'where' clause
 
takePositionsOfWordFromFile:: FilePath->String->IO String
takePositionsOfWordFromFile path word = do
  allWords <- readFile path
  if null allWords
    then return ""
    else return$ show$ tail$ scanl'
           (\acc x -> acc + T.length x + length word)
           (negate (length word))
           (init$ T.splitOn (T.pack word) (T.pack allWords))
 
 
helpMsg::String
helpMsg = "Show 'Help' message, as you see now. \n" ++
          "Format of usage: -f <file name> -m <mode> -s <arg>, where mode is 'find' for take positions of <arg> in file, 'checksum' take sum of all nums in file (no args) \n"
1
Модератор
 Аватар для Curry
5158 / 3484 / 536
Регистрация: 01.06.2013
Сообщений: 7,557
Записей в блоге: 9
29.12.2015, 19:29
NoobsEnslaver, можно и так
Haskell
1
parseArgs ("-f":str1:"-m":str2:"-s":str3:_)
И замените в case -ах otherwise-ы на _ .
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
29.12.2015, 19:29
Помогаю со студенческими работами здесь

Кто опознает драйвер
шагового двигателя, биполярный, от сканера. DIP22. ...

Не опознает класс мультимедия
В коде ничего не менял, взял заготовку (работает), добавил строку #include &quot;QAudioInput&quot; и все работать перестает. Удаляю эту...

Не опознает usb устройства
При включении флешки/принтера/вебки и подобного пишет &quot;Устройство USB не опознано. Одно из подключенных к этому компьютеру USB-устройств...

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

Hp 4180 не опознает полний картридж
вчера заправил картридж №21 а лампочка так и мигает &quot;нет чернила в картридже&quot;, почитал пару форумов - там рекомендуют прочистить сопла...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. На мобильном - сканируйте QR-код. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru