Мне нужно написать функцию titleRec::[String] -> [String], которая, учитывая список слова, пишет их с заглавной буквы, так как название должно быть написано с большой буквы. Правильный капитализация названия (для наших целей) выглядит следующим образом: Первое слово следует писать с большой буквы. Любое другое слово следует писать с заглавной буквы, если оно не менее четырех букв.
Я дошел до того,
capitalisedRec :: String -> String
capitalisedRec [] = []
capitalisedRec (x:xs) = toUpper x : lowered xs
where
lowered [] = []
lowered (x:xs) = toLower x : lowered xs
capitilized2 :: String -> String
capitilized2 xs = [toLower x | x <-xs]
titleRec :: [String] -> [String]
titleRec [] = []
titleRec (x:xs) = capitalisedRec x : adjust xs
where
adjust [] = []
adjust (y:ys) = [if (length y >= 4) then capitalisedRec y else capitilized2 y | y<- ys]
Но когда я запускаю его в списке строк, например, titleRec ["tHe", "bOSun", "ANd", "thE", "BriDGe"] это приводит к ["The","and","the" ,"Мост"], в основном пропускает второе слово. Я не понимаю, почему.
Ваш код гласит:
adjust (y:ys) =
[ if (length y >= 4)
then capitalisedRec y
else capitilized2 y
| y <- ys]
но первый y
в дальнейшем не используется, отбрасывая его! Последний y
не имеет отношения к первому и затмевает его.
Минимальное исправление модификации будет:
adjust (y:ys) =
[ if (length y2 >= 4)
then capitalisedRec y2
else capitilized2 y2
| y2 <- y:ys]
Я настоятельно рекомендую вам всегда включать предупреждения с помощью -Wall
. При этом GHC предупредит о том, что y
не используется (а также о затенении).
@EgeGülce Вы можете использовать его в одном из следующих мест: 1) когда вы запускаете ghci, например. ghci -Wall Myfile.hs
(то же самое для ghc
), 2) после запуска ghci, используя :set -Wall
в приглашении, 3) в первой (или около того) строке файла .hs, используя {-# OPTIONS_GHC -Wall #-}
Спасибо, я впервые пытаюсь выучить функциональный язык, поэтому мне трудно. Я использую vscode для компиляции, где я могу написать команду -Wall? Терминал выдает ошибку: <interactive>:35:1: error: • Конструктор данных не в области видимости: Wall • Возможно, вы имели в виду переменную all (импортирована из Prelude)