Zwijanie z anonimowych funkcji

0

Pytanie

Obecnie próbuję nauczyć się składanie.

Ale zamiast korzystać z gotowych funkcji chcę korzystać z własnych.

Dlatego chcę podwoić wszystkie samogłoski w wierszu.

doubleVowels :: String -> String

Moja próba (na razie tylko dla "a", tak jak ja staram się najpierw rozwiązać ją do jednej litery i расширю i оптимизирую ją, jak tylko zostanie uruchomiony):

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

Próbując uruchomić ten kod, otrzymuję następujący błąd:

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

Najlepsza odpowiedź

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

W większości przypadków, jeśli nie ma konkretnej przyczyny foldlużyjfoldr zamiast foldl ponieważ pozwala to kompilator Haskell leniwie oceniać swój wyraz. Jeśli dobrze pamiętam, nawet wtedy użyj foldl'tak jak foldl nie jest surowym i zajmuje zbyt dużo pamięci, nie dając żadnych korzyści z lenistwa.

Ponadto, brakuje ci drugiego argumentu, aby foldrs (lub foldls) funkcja. foldr ma typ:

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

Funkcja foldr ma typ a -> b -> b gdzie pierwszy argument-bieżący element składanej konstrukcji, a drugi akumulator. Używana sonda ma tylko jeden parametr.

Ponadto, ciało funkcji lambda też nie ma większego sensu.

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

a jest parametrem, który otoczenia funkcja doubleVowels dostaje. Tutaj trzeba użyć ustawienia funkcji lambda.

2021-11-20 04:24:46
4

Przede wszystkim, funkcja wykorzystywana w foldl powinno być dwa argumenty. Pierwszy-to skumulowany wynik, a drugi-bieżący znak. Po drugie, procedura oceny foldl od lewej do prawej, więc musimy reverse wynikowy ciąg.

Na przykład, oto zmodyfikowana wersja

 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

W innych językach

Ta strona jest w innych językach

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

Popularne w tej kategorii

Najczęściej zadawane pytania w tej kategorii