[Haskell-beginners] Unmaybe

Adrian May adrian.alexander.may at gmail.com
Tue May 14 16:56:53 CEST 2013

Thanks everyone. The first suggestion did the trick without needing any
other modules.

> What instance of Monoid is this?

I dunno, but the context is a gantt chart drawing program:

data Task = Task {  name :: String,  desc :: String,   dur :: Days  } --
tasks is a list of these and deps is a list of...
data Dep = Dep {  pre :: String,   post :: String  } -- referring to Task's
-- draw the squiggles representing sequential dependencies:
beziset = foldl atop mempty $ map ((maybe mempty id).bezis) deps
bezis (Dep bef aft) =
    findIndex (\t-> name t == bef) tasks >>= \bti ->
    findIndex (\t-> name t == aft) tasks >>= \ati ->
    let t1 = fromIntegral bti in
    let d1 = finish (tasks !! bti) in   --finish is begin + duration
    let t2 = fromIntegral ati in
    let d2 = begin (tasks !! ati) in  --begin is the latest of the end
dates of the directly preceding tasks (or project kickoff)
    return ( -- the following monstrosity is just about my coordinate system
      fromSegments [bezier3 (r2 (1.3,0)) (r2 (d2-d1-1,-(t2-t1)*(1+gap)))
(r2 (d2-d1,-(t2-t1)*(1+gap))) ] #
         translate (r2 (descspace+d1,-t1*(1+gap))) )

beziset then gets `atop`ed onto a Diagram.

bezis looks far too long as well. Any way to tidy it up? (For some perverse
reason I still don't like do notation.) (I know the bezier3 expression is
hideous but I can fix that myself.)


PS: In my previous job I once spent a week evaluating gantt chart drawing
softwares. Now I wrote the one I was looking for in half a day. That's

On 14 May 2013 20:08, Kim-Ee Yeoh <ky3 at atamo.com> wrote:

> On Tue, May 14, 2013 at 4:21 PM, Adrian May <
> adrian.alexander.may at gmail.com> wrote:
>> I have a really annoying scrap of code:
>> unmaybe Nothing = mempty
>> unmaybe (Just dia) = dia
>> It happened because I'm using Diagrams but building my diagram requires
>> looking something up in a list using findIndex, which returns Maybe Int.
> What instance of Monoid is this? Because Int has both a Sum Int and a
> Product Int instance so you can't just apply unmaybe to (Just 3 :: Maybe
> Int).
> Defining unmaybe Nothing = 0 prompts the question: how will you
> distinguish misses versus hits on the head of the list? Presumably you
> don't want to.
> You might be interested in the totalized lookup functions defined in my
> private toolkit (hayoo returns nothing):
> -- tlookup :: (Eq a) => b -> a -> [(a, b)] -> b
> tlookup b a abs = fromMaybe b $ lookup a abs
> tlookup0  a abs = tlookup mempty a abs
> -- Kim-Ee
> _______________________________________________
> Beginners mailing list
> Beginners at haskell.org
> http://www.haskell.org/mailman/listinfo/beginners
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.haskell.org/pipermail/beginners/attachments/20130514/5a50d159/attachment.htm>

More information about the Beginners mailing list