Рекурсивная функция в Haskell для записи каждого слова в списке строк

Мне нужно написать функцию 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" ,"Мост"], в основном пропускает второе слово. Я не понимаю, почему.

Что такое компоненты React? Введение в компоненты | Типы компонентов
Что такое компоненты React? Введение в компоненты | Типы компонентов
Компонент - это независимый, многократно используемый фрагмент кода, который делит пользовательский интерфейс на более мелкие части. Например, если мы...
0
0
88
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваш код гласит:

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 не используется (а также о затенении).

Спасибо, я впервые пытаюсь выучить функциональный язык, поэтому мне трудно. Я использую vscode для компиляции, где я могу написать команду -Wall? Терминал выдает ошибку: <interactive>:35:1: error: • Конструктор данных не в области видимости: Wall • Возможно, вы имели в виду переменную all (импортирована из Prelude)

Ege Gülce 28.11.2022 17:27

@EgeGülce Вы можете использовать его в одном из следующих мест: 1) когда вы запускаете ghci, например. ghci -Wall Myfile.hs (то же самое для ghc), 2) после запуска ghci, используя :set -Wall в приглашении, 3) в первой (или около того) строке файла .hs, используя {-# OPTIONS_GHC -Wall #-}

chi 28.11.2022 18:17

Другие вопросы по теме