"Jason Dagit" <[EMAIL PROTECTED]> writes: > Well, this is basically just a zip with a special base case. But you > can't just write it with zipWith because zipWith stops when it exausts > either list. > > How about we define zipWith'' like this: > zipWith'' _ [] _ l _ = [l] > zipWith'' _ _ [] _ r = [r] > zipWith'' f (x:xs) (y:ys) l r = f x y : zipWith'' f xs ys l r > > Then we can write: > isPrefixOf xs ys = and (zipWith'' (==) xs ys True False)
I wonder if there is mileage to be had from persuing something like this, rather different (off top of head, very provisional, E&OE &c) approach: extend_infinitely l = map Just l ++ repeat Nothing promote1 rel (Just a) b = rel a b promote1 rel Nothing b = False is_pfx_of l1 l2 = and (zipWith (promote1 (==)) (extend_infinitely l2) l1) ? For at least the few minutes I've thought about it, it seems like promote and extend_infinitely might be more generally userful. I've probably missed something better, too. > A point free reduction might look like the following and probably > isn't worth it: > isPrefixOf = (and .) . flip flip False . flip flip True . zipWith'' (==) "probably"? -- Jón Fairbairn [EMAIL PROTECTED] _______________________________________________ Haskell-Cafe mailing list Haskell-Cafe@haskell.org http://www.haskell.org/mailman/listinfo/haskell-cafe