Skládací s anonymní funkcí

0

Otázka

Já jsem v současné době snaží naučit skládací.

Ale místo toho, pomocí předdefinované funkce chci použít svou vlastní.

Takže chci zdvojnásobit všechny samohlásky v Řetězci.

doubleVowels :: String -> String

Můj pokus (zatím jen pro "a", jako jsem to zkusit vyřešit za jedno písmeno první a bude rozšiřovat a optimalizovat ji, jakmile to běží):

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

Snažím se spustit kód dostávám následující erorr:

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

Nejlepší odpověď

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

Ve většině případů, pokud není žádný zvláštní důvod, pro foldlpoužijte foldr místo foldl jako to umožňuje Haskell compiler se líně zhodnotit své vyjádření. Pokud si dobře vzpomínám, i tak použít foldl'od foldl není striktní a vyžaduje příliš mnoho paměti, zatímco ne dávat vám žádný prospěch pro lenost.

Nehledě na to, že chybí druhý argument foldrs (nebo foldls) funkce. foldr má typ:

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

Funkce foldr má typ a -> b -> b kde první argument je aktuální prvek skládací konstrukce a druhý je akumulátor. Lambda se, že používáte pouze jeden parametr.

Kromě toho, tělo lambda funkce také nedává moc smysl.

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

a je to parametr, který okolní funkce doubleVowels obdrží. Musíte použít parametry lambda funkce.

2021-11-20 04:24:46
4

Za prvé, funkce, používané v foldl měl dva argments. První z nich je accmulated výsledek, a druhý je aktuální znak. Za druhé, aby hodnocení foldl je zleva doprava, takže musíme reverse výsledek řetězec.

Například, tady je upravená verze

 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

V jiných jazycích

Tato stránka je v jiných jazycích

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

Populární v této kategorii

Oblíbené položky v této kategorii