Prefijo con suma acotada
Definir la función
| 1 |    prefijoAcotado :: (Num a, Ord a) => a -> [a] -> [a] | 
tal que (prefijoAcotado x ys) es el mayor prefijo de ys cuya suma es menor que x. Por ejemplo,
| 1 2 |    prefijoAcotado 10 [3,2,5,7]  ==  [3,2]    prefijoAcotado 10 [1..]      ==  [1,2,3] | 
Soluciones
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | -- 1ª definición (por recursión): prefijoAcotado :: (Num a, Ord a) => a -> [a] -> [a] prefijoAcotado x [] = [] prefijoAcotado x (y:ys)   | y < x     = y : prefijoAcotado (x-y) ys   | otherwise = [] -- 2ª definición (con scanl1 y takeWhile): prefijoAcotado2 :: (Num a, Ord a) => a -> [a] -> [a] prefijoAcotado2 x ys = map fst conSumasAcotadas   where      sumas            = scanl1 (+) ys      conSumas         = zip ys sumas     conSumasAcotadas = takeWhile (\(a,b) -> b < x) conSumas -- 3ª definición (con (.)): prefijoAcotado3 :: (Num a, Ord a) => a -> [a] -> [a] prefijoAcotado3 x ys = map fst conSumasAcotadas   where      sumas            = scanl1 (+) ys      conSumas         = zip ys sumas     conSumasAcotadas = takeWhile ((<x) . snd) conSumas -- 4ª definición: prefijoAcotado4 :: (Num a, Ord a) => a -> [a] -> [a] prefijoAcotado4 x ys =      map fst (takeWhile ((<x) . snd) (zip ys (scanl1 (+) ys))) |