[Haskell-cafe] Is this haskelly enough?

Bjorn Bringert bringert at cs.chalmers.se
Tue Jul 17 17:08:34 EDT 2007


On Jul 17, 2007, at 22:26 , James Hunt wrote:

> Hi,
>
> As a struggling newbie, I've started to try various exercises in  
> order to improve. I decided to try the latest Ruby Quiz (http:// 
> www.rubyquiz.com/quiz131.html) in Haskell. Would someone be kind  
> enough to cast their eye over my code? I get the feeling there's a  
> better way of doing it!
>
> subarrays :: [a] -> [[a]]
> subarrays [] = [[]]
> subarrays xs = (sa xs) ++ subarrays (tail xs)
>  where sa xs = [ys | n <- [1..length xs], ys <- [(take n xs)]]
>
> maxsubarrays :: [Integer] -> [Integer]
> maxsubarrays xs = msa [] (subarrays xs)
>  where
>    msa m [] = m
>    msa m (x:xs)
>      | sum x > sum m = msa x xs
>      | otherwise     = msa m xs
>
> --for testing: should return [2, 5, -1, 3]
> main = maxsubarrays [-1, 2, 5, -1, 3, -2, 1]
>
> I've read tutorials about the syntax of Haskell, but I can't seem  
> to find any that teach you how to really "think" in a Haskell way.  
> Is there anything (books, online tutorials, exercises) that anyone  
> could recommend?
>
> Thanks,
> James

Hi james,

here's one solution:

import Data.List

maxsubarrays xs = maximumBy (\x y -> sum x `compare` sum y) [zs | ys  
<- inits xs, zs <- tails ys]


This can be made somewhat nicer with 'on':

import Data.List

maxsubarrays xs = maximumBy (compare `on` sum) [zs | ys <- inits xs,  
zs <- tails ys]

on, which will appear in Data.Function in the next release of base,  
is defined thusly:

on :: (b -> b -> c) -> (a -> b) -> a -> a -> c
(*) `on` f = \x y -> f x * f y


/Björn





More information about the Haskell-Cafe mailing list