Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Haskell Проверка на заглавную букву. / 24 сообщений из 24, страница 1 из 1
25.11.2010, 00:20
    #36975754
katerinka1989
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Haskell Проверка на заглавную букву.
Здравствуйте!
Только вот вчера начали в университете проходить Хаскель.

Одно из заданий заключается в проверке двух слов , а именно имени и фамилии на заглавные буквы.
Т.е. если введены имя и фамилия с заглавной буквы, то программу выдают True или выражение на подобе "Верно" =). Если имя и фамилия введены маленькими или большими буквами, то программы выдает или False или что-нить на подобе "Напишите имя и фамилию с заглавных букв"

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

Я написала три варианта и для каждого хаскель выдёт мне ошибку. Подскажите где мы что надо исправить и вобще в правильном ли я направлении думаю?

Спасибо огромное!

Для моего первого варианта Хаскель говорит
Uebung5.hs:5:4: parse error on input `case'
import Char
isName :: String -> Char
isName []
isName p(x:xs)
case of
isUpper (head(x:xs)) && isLower (tail(x:xs)) -> putStrLn "You entered your name right"
isUpper (head(x:xs)) && isUpper (tail(x:xs)) -> putStrLn "Enter only the begining letter large"
isLower (head(x:xs)) && isUpper (tail(x:xs)) -> putStrLn "Enter only the begining letter large"
isLower (head(x:xs)) && isLower (tail(x:xs)) -> putStrLn
else if isLower (head(x:xs)) && isUpper (tail(x:xs)) )
then False


Для второго выдаёт:
Uebung5.hs:5:4: parse error on input `if'

import Char
isName :: String -> Bool -> Bool
isName []
isName (x:xs)
if isUpper (head(x:xs)) && isLower (tail(x:xs))
then True
else if isLower (head(x:xs)) && isUpper (tail(x:xs)) )
then False




Для 3его выдаёт вот это:
Uebung5.hs:4:0:
The type signature for `isName' lacks an accompanying binding


import Char
isName :: String -> Bool -> Bool
isName []
isName p(x:xs)
|isUpper px = x : isName isLower p xs
|otherwise = False
...
Рейтинг: 0 / 0
25.11.2010, 01:04
    #36975773
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Haskell Проверка на заглавную букву.
Код: plaintext
1.
import Char
isName (n:ns) = isUpper n && (all isLower ns)
для проверки одного имени.
...
Рейтинг: 0 / 0
25.11.2010, 01:08
    #36975775
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Haskell Проверка на заглавную букву.
замечание

выражение типа
x:xs - используется для разделения списка на голову и хвост, поэтому запись вида
Код: plaintext
1.
isName (x:xs)
if isUpper (head(x:xs)) && isLower (tail(x:xs)) 
бессмысленна, нужно переписать так
Код: plaintext
1.
isName (x:xs)
if isUpper x && (isLower xs) 
или
Код: plaintext
1.
isName xs
if isUpper (head xs && isLower (tail(xs) 
...
Рейтинг: 0 / 0
25.11.2010, 01:27
    #36975781
katerinka1989
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Haskell Проверка на заглавную букву.
ZyK_BotaN,

Он у меня всё равно выдаёт ошибку, связанную c if
Я понять не могу почему

import Char
isName1 (x:xs)=do
if isUpper x && (isLower xs)
then True
else if isLower x && isUpper xs
then False


И спасибо за скорый ответ
...
Рейтинг: 0 / 0
25.11.2010, 01:45
    #36975784
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Haskell Проверка на заглавную букву.
katerinka1989ZyK_BotaN,

Он у меня всё равно выдаёт ошибку, связанную c if
Я понять не могу почему

import Char
isName1 (x:xs)=do
if isUpper x && (isLower xs)
then True
else if isLower x && isUpper xs
then False


И спасибо за скорый ответ
isLower xs - неправильное вырожение.
isLower проверяет символ, а xs - строка.
чем тебе мой пример не понравился?
чтобы проверить строку используй ф-и all
...
Рейтинг: 0 / 0
25.11.2010, 01:53
    #36975789
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Haskell Проверка на заглавную букву.
katerinka1989 if isUpper x && (isLower xs)
then True
else if isLower x && isUpper xs
then False

еще одно замечание по поводу этого кода.

не пользуйся оператором if, если результат имеет булев тип.

запись

Код: plaintext
1.
if cond then True else False
эквивалентна записи
Код: plaintext
1.
cond
, где cond - условие.

З.Ы. в каком универе учишься, далеко не везде хаскелл преподают.
...
Рейтинг: 0 / 0
25.11.2010, 02:54
    #36975810
katerinka1989
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Haskell Проверка на заглавную букву.
авторчем тебе мой пример не понравился?
Мне он очень даже и понравился. Я поэтому его
отсюда

авторбессмысленна, нужно переписать так
isName (x:xs)
if isUpper x && (isLower xs)

и скопировала и вставила в свой код. или так нельзя делать?))

автореще одно замечание по поводу этого кода.
не пользуйся оператором if, если результат имеет булев тип.
запись
if cond then True else False
эквивалентна записи
cond
, где cond - условие.


хорошо, тогда это мой новый код, который должен работать,да? но он не рабоатет так как cond is not in scope.

import Char
isName xs
cond isUpper (head xs && isLower (tail(xs)))


и как можно тогда ещё этот исправить?

import Char
isName :: String -> Char
isName []
isName (x:xs)
case (x:xs) of
isUpper x && isLower xs -> putStrLn "You entered your name right"
isUpper x && isUpper xs -> putStrLn "Enter only the begining letter large"
isLower x && isUpper xs -> putStrLn "Enter only the begining letter large"
isLower x && isLower xs -> putStrLn "First letters must be large!"
else if isLower x:xs && isUpper xs
then False

Я в Берлине учусь.
...
Рейтинг: 0 / 0
25.11.2010, 07:21
    #36975865
tempestadept
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Haskell Проверка на заглавную букву.
Во-первых, в первом клозе нужна правая часть.
Во-вторых, второй клоз короче всего переписать так, как в первом посте ZyK_BotaN.
В вашем же коде неверный синтаксис case (там используются не логические условия, а образцы, в этой задаче case не нужен), неверные типы: из функции логично возвращать Bool, а никак не Char; putStrLn же вообще имеет тип String -> IO (), а IO здесь совершенно незачем.
Код: plaintext
1.
2.
3.
import Data.Char
isName :: String -> Bool
isName [] = False
isName (x:xs) = isUpper x && all isLower xs
...
Рейтинг: 0 / 0
25.11.2010, 10:41
    #36976222
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Haskell Проверка на заглавную букву.
katerinka1989 Я поэтому его
отсюда

авторбессмысленна, нужно переписать так
isName (x:xs)
if isUpper x && (isLower xs)

и скопировала и вставила в свой код. или так нельзя делать?))


ты пропустила ф-ю all .
запись isLower xs - не корректна, xs - не символ а строка.
...
Рейтинг: 0 / 0
25.11.2010, 10:43
    #36976231
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Haskell Проверка на заглавную букву.
katerinka1989хорошо, тогда это мой новый код, который должен работать,да? но он не рабоатет так как cond is not in scope.

import Char
isName xs
cond isUpper (head xs && isLower (tail(xs)))


и как можно тогда ещё этот исправить?

нет такой ф-и cond, я же написал, подставь вместо cond - условие.
...
Рейтинг: 0 / 0
25.11.2010, 11:22
    #36976349
katerinka1989
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Haskell Проверка на заглавную букву.
ZyK_BotaN,
я не пропускала all

авторбессмысленна, нужно переписать так
isName (x:xs)
if isUpper x && (isLower xs)
или
isName xs
if isUpper (head xs && isLower (tail(xs)

я взяла коды отсюда, а не код с all
и я не понимаю расставление скобок во втором.
должно это так выглядеть?

isName xs isUpper (head (xs)) && isLower (tail (xs))

или так?
isName xs isUpper (head xs) && isLower (tail xs)


хорошо. для одного имени я поняла. для двух слов аналогично получается?

как например
isName :: Double ->Double -> Bool
isName xs ys
isName [] = False
isName xs ys isUpper (head (xs)) && all isLower (tail (xs)) && isUpper (head (ys)) && all isLower (tail (ys))
...
Рейтинг: 0 / 0
25.11.2010, 11:38
    #36976411
tempestadept
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Haskell Проверка на заглавную букву.
Какой ещё Double??
Код: plaintext
1.
bothNames :: String -> String -> Bool
bothNames s1 s2 = isName s1 && isName s2
...
Рейтинг: 0 / 0
25.11.2010, 12:12
    #36976531
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Haskell Проверка на заглавную букву.
katerinka1989ZyK_BotaN,
я не пропускала all


я взяла коды отсюда, а не код с all
без all работать не будет
...
Рейтинг: 0 / 0
25.11.2010, 21:27
    #36977931
katerinka1989
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Haskell Проверка на заглавную букву.
Спасибо за объяснения.

Тогда получается всё так

import Data.Char

isName :: String -> String -> Bool
isName n1 n2 = isName1 n1 && isName1 n2

isName1 :: String -> Bool
isName1 [] = False
isName1 (x:xs) = isUpper x && all isLower xs

но оно всё равно не работает.
...
Рейтинг: 0 / 0
25.11.2010, 23:18
    #36978008
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Haskell Проверка на заглавную букву.
katerinka1989Спасибо за объяснения.

Тогда получается всё так

import Data.Char

isName :: String -> String -> Bool
isName n1 n2 = isName1 n1 && isName1 n2

isName1 :: String -> Bool
isName1 [] = False
isName1 (x:xs) = isUpper x && all isLower xs

но оно всё равно не работает.

на каком тестовом примере ошибка?
у меня вроде ваш код работает.
...
Рейтинг: 0 / 0
25.11.2010, 23:54
    #36978026
katerinka1989
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Haskell Проверка на заглавную букву.
<interactive>:1:0:
No instance for (Show (String -> Bool))
arising from a use of `print' at <interactive>:1:0-15
Possible fix:
add an instance declaration for (Show (String -> Bool))
In a stmt of an interactive GHCi command: print it
...
Рейтинг: 0 / 0
25.11.2010, 23:59
    #36978031
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Haskell Проверка на заглавную букву.
katerinka1989,

вы передаете ф-и только одну строку, а надо две.
...
Рейтинг: 0 / 0
26.11.2010, 00:14
    #36978045
katerinka1989
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Haskell Проверка на заглавную букву.
м... что?

я передаю функции только одну строку, а надо две.

isName :: String -> String -> Bool
isName n1 n2 = isName1 n1 && isName1 n2

речь идёт об этой строчке?
...
Рейтинг: 0 / 0
26.11.2010, 00:16
    #36978046
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Haskell Проверка на заглавную букву.
katerinka1989м... что?

я передаю функции только одну строку, а надо две.

isName :: String -> String -> Bool
isName n1 n2 = isName1 n1 && isName1 n2

речь идёт об этой строчке?

да, у ф-и isName - два аргумента
...
Рейтинг: 0 / 0
26.11.2010, 00:29
    #36978052
katerinka1989
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Haskell Проверка на заглавную букву.
а сколько мне их там тогда надо? у меня фамилия и имя это и есть два аргумента.
или мне их надо разделить и сделать что-то вроде этого?

isName n1 = isName1 n1
isName n2 = isName1 n2
...
Рейтинг: 0 / 0
26.11.2010, 00:41
    #36978061
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Haskell Проверка на заглавную букву.
katerinka1989а сколько мне их там тогда надо? у меня фамилия и имя это и есть два аргумента.
или мне их надо разделить и сделать что-то вроде этого?

isName n1 = isName1 n1
isName n2 = isName1 n2

в определении все нормально, проблема при вызове функции
дайте скриншот интерпретатора
...
Рейтинг: 0 / 0
26.11.2010, 00:50
    #36978066
katerinka1989
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Haskell Проверка на заглавную букву.
...
Рейтинг: 0 / 0
26.11.2010, 01:07
    #36978075
ZyK_BotaN
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Haskell Проверка на заглавную букву.
katerinka1989,

Код: plaintext
isName "Kataj" "Kk"
...
Рейтинг: 0 / 0
26.11.2010, 01:12
    #36978076
katerinka1989
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Haskell Проверка на заглавную букву.
м. да. это было глупо
спасибо большое))))
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Haskell Проверка на заглавную букву. / 24 сообщений из 24, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]