efektivita foldl + lambda function - haskell

stewe

efektivita foldl + lambda function - haskell
« kdy: 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?


Tomáš

Re:efektivita foldl + lambda function - haskell
« Odpověď #1 kdy: 01. 12. 2011, 00:24:29 »
Kód: [Vybrat]
elem _ []       = False
elem x (y:ys)   = x==y || elem x ys

PetrK

Re:efektivita foldl + lambda function - haskell
« Odpověď #2 kdy: 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.

stewe

Re:efektivita foldl + lambda function - haskell
« Odpověď #3 kdy: 01. 12. 2011, 00:54:53 »
diky obom