Сворачивание с анонимными функциями

0

Вопрос

В настоящее время я пытаюсь научиться складыванию.

Но вместо использования предопределенных функций я хочу использовать свои собственные.

Поэтому я хочу удвоить все гласные в строке.

doubleVowels :: String -> String

Моя попытка (пока только для "а", так как я пытаюсь сначала решить ее для одной буквы и расширю и оптимизирую ее, как только она запустится):

doubleVowels :: String -> String
doubleVowels  a = foldl (\eachChar -> if eachChar == 'a' then (a ++ "aa") else a) "" a

Пытаясь запустить этот код, я получаю следующую ошибку:

Experimenting.hs:8:78: error:
    * Couldn't match type `[Char]' with `Char -> Char'
      Expected type: Char -> Char
        Actual type: String
    * In the expression: a
      In the expression: if eachChar == 'a' then (a ++ "aa") else a
      In the first argument of `foldl', namely
        `(\ eachChar -> if eachChar == 'a' then (a ++ "aa") else a)'
  |
8 | doubleVowels a = foldl (\eachChar -> if eachChar == 'a' then (a ++ "aa") else a) "" a
  |                                                                              ^

Experimenting.hs:8:81: error:
    * Couldn't match expected type `Char' with actual type `[Char]'
    * In the second argument of `foldl', namely `""'
      In the expression:
        foldl
          (\ eachChar -> if eachChar == 'a' then (a ++ "aa") else a) "" a
      In an equation for `doubleVowels':
          doubleVowels
            = foldl
                (\ eachChar -> if eachChar == 'a' then (a ++ "aa") else a) "" a
  |
8 | doubleVowels a = foldl (\eachChar -> if eachChar == 'a' then (a ++ "aa") else a) "" a
  |                                                                                 ^^
Failed, no modules loaded.

2

Лучший ответ

4
doubleVowels :: String -> String
doubleVowels  a = foldr (\eachChar b -> if eachChar == 'a' then ("aa" ++ b) else (eachChar:b)) "" a

В большинстве случаев, если нет конкретной причины для foldl, используйтеfoldr вместо foldl поскольку это позволяет компилятору Haskell лениво оценивать ваше выражение. Если я правильно помню, даже тогда используйте foldl', так как foldl не является строгим и занимает слишком много памяти, не давая вам никакой пользы от лени.

Кроме того, вам не хватает второго аргумента, чтобы foldrs (или foldls) функция. foldr имеет тип:

foldr :: (a -> b -> b) -> b -> t a -> b

Функция для foldr имеет тип a -> b -> b где первый аргумент-текущий элемент складной конструкции, а второй-аккумулятор. Используемая вами лямбда имеет только один параметр.

Кроме того, тело лямбда-функции также не имеет большого смысла.

if eachChar == 'a' then (a ++ "aa") else a)

a является параметром, который окружающая функция doubleVowels получает. Здесь вам нужно использовать параметры лямбда-функции.

2021-11-20 04:24:46
4

Прежде всего, функция, используемая в foldl должно быть два аргумента. Первый-это накопленный результат, а другой-текущий символ. Во-вторых, порядок оценки foldl слева направо, поэтому мы должны reverse результирующая строка.

Например, вот модифицированная версия

 doubleVowels :: String -> String
 doubleVowels s = reverse $ foldl (\x y -> if y == 'a' then ("aa" ++ x) else (y : x)) "" s
2021-11-20 04:13:13

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

Популярное в этой категории

Популярные вопросы в этой категории