Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: stewe 30. 11. 2011, 23:18:36

Název: efektivita foldl + lambda function - haskell
Přispěvatel: stewe 30. 11. 2011, 23:18:36
zdar,

mam takuto funkciu:
Kód: [Vybrat]
elem' :: (Eq a) => a -> [a] -> Bool 
elem' y ys = foldl (\acc x -> if x == y then True else acc) False ys

predpokladam ze viete co to robi, a teraz, ked je v poli ten hladany prvok acc je true, ale clovek by predpokladal, ze potom cela ta funkcia skonci (je tam taky prvok tak uz proste netreba zistovat do konca pola). ako by sa to dalo napisat podobne s tym, aby funkcia skoncila akonahle sa ten prvok najde?
Název: Re:efektivita foldl + lambda function - haskell
Přispěvatel: Tomáš 01. 12. 2011, 00:24:29
Kód: [Vybrat]
elem _ []       = False
elem x (y:ys)   = x==y || elem x ys
Název: Re:efektivita foldl + lambda function - haskell
Přispěvatel: PetrK 01. 12. 2011, 00:41:26
v haskellu (v cistem) pokud mate nejaky retizek funkci L ( L (  L ( ... tak se vzdy musi vyhodnotit vsechny, nelze nikam doprostred dat break a to i ve chvili (vas pripad), kdy nekde v x-tem zanoreni vite celkovou vyslednou hodnotu. Funkce foldl prave takovy retizek volani vyrobi (tail rekurze), takze ne, vas pripad zefektivnit nejde. To ceho chcete dosahnout dela funkce foldr, tedy ve chvili, kdy zjisti, ze do acc se dostalo True a ta lambda fce uz nikdy nic jineho vratit nemuze, tak skonci.
Název: Re:efektivita foldl + lambda function - haskell
Přispěvatel: stewe 01. 12. 2011, 00:54:53
diky obom