<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Windows-1252">
<style type="text/css" style="display:none;"> P {margin-top:0;margin-bottom:0;} </style>
</head>
<body dir="ltr">
<div style="font-family: Calibri, Arial, Helvetica, sans-serif; font-size: 12pt; color: rgb(0, 0, 0); background-color: rgb(255, 255, 255);">
As others explained, you still can't do (1 + whereIsBM Ix), you need to unwrap the whereIsBM value or use fmap (<$>).<br>
<br>
Here, let me give you a small modification on your code that will do it:<br>
<br>
whereIsBM boiList = case boiList of<br>
                      Nothing -> Nothing<br>
                      Just (Cons idx lx)<br>
                        | (idx == Bacon) -> Just 1<br>
                        | otherwise -> (1 +) <$> (whereIsBM lx)<br>
<br>
And as others have explained, what this does is take the result of (whereIsBM Ix), which is a Maybe-wrapped value, and apply the function ((1 +) <$>) (alternatively, (fmap (1 +))), which basically just takes the function (1 +) (add 1 to a number) and applies
 it to whatever is wrapped inside the Maybe (your numbers), while keeping the Maybe structure. So if the result of (whereIsBM x) is Nothing, then applying ((1 +) <$>) will return Nothing because there's nothing wrapped, whereas if (whereIsBM x) is (Just n),
 then applying ((1 + ) <$>) to it will return (Just (1 + n)).<br>
<br>
You could also, as others explained, case match on the result of (whereIsBM Ix), but that would be more verbose and probably just confuse you. But it is, ultimately, what fmap is actually doing. Unwrapping and re-wrapping.<br>
</div>
<div id="appendonsend"></div>
<hr style="display:inline-block;width:98%" tabindex="-1">
<div id="divRplyFwdMsg" dir="ltr"><font face="Calibri, sans-serif" style="font-size:11pt" color="#000000"><b>From:</b> Haskell-Cafe <haskell-cafe-bounces@haskell.org> on behalf of Galaxy Being <borgauf@gmail.com><br>
<b>Sent:</b> 29 March 2021 05:27<br>
<b>To:</b> haskell-cafe <haskell-cafe@haskell.org><br>
<b>Subject:</b> Re: [Haskell-cafe] Maybe won't let me count</font>
<div> </div>
</div>
<div>
<div style="background-color:#fff2e6; border:2px dotted #ff884d"><span style="font-size:12pt; font-family:sans-serif; color:black; font-weight:bold; padding:.2em">This email was sent to you by someone outside the University.</span>
<div style="font-size:10pt; font-family:sans-serif; font-style:normal; padding:.2em">
You should only click on links or attachments if you are certain that the email is genuine and the content is safe.</div>
</div>
<div>
<div dir="ltr">
<div>I'm not getting past</div>
<div><br>
</div>
whereIsBM boiList = case boiList of<br>
                      Nothing -> Nothing<br>
                      Just (Cons idx lx)<br>
                        | (idx == Bacon) -> Just 1<br>
                        | otherwise -> Just (1 + whereIsBM lx)<br>
<div><br>
</div>
<div>...and a few other attempts.</div>
</div>
<br>
<div class="x_gmail_quote">
<div dir="ltr" class="x_gmail_attr">On Sun, Mar 28, 2021 at 10:37 PM Jon Purdy <<a href="mailto:evincarofautumn@gmail.com">evincarofautumn@gmail.com</a>> wrote:<br>
</div>
<blockquote class="x_gmail_quote" style="margin:0px 0px 0px 0.8ex; border-left:1px solid rgb(204,204,204); padding-left:1ex">
<div dir="auto">
<div>‘whereIsBM’ returns a Maybe-wrapped value, so applying ‘1 + …’ to it would require ‘Maybe a’ to be in ‘Num’, hence the error message. ‘FlexibleContexts’ (ditto ‘FlexibleInstances’) is a pretty benign extension, but it won’t help here, since it just kicks
 the error down the road a bit.</div>
<div dir="auto"><br>
</div>
<div dir="auto">The basic thing you need to do is match on the Maybe and return ‘Nothing’ if it was ‘Nothing’, or ‘Just (1 + x)’ if it was ‘Just x’ for some x. That can be written quite literally as a ‘case’ expression:</div>
<div dir="auto"><br>
</div>
<div dir="auto">case whereIsBM lx of</div>
<div dir="auto">  Just x -> Just (1 + x)</div>
<div dir="auto">  Nothing -> Nothing</div>
<div dir="auto"><br>
</div>
<div dir="auto">Which could also be written with ‘do’:</div>
<div dir="auto"><br>
</div>
<div dir="auto">do</div>
<div dir="auto">  x <- whereIsBM lx</div>
<div dir="auto">  pure (1 + x)</div>
<div dir="auto"><br>
</div>
<div dir="auto">But this pattern is very common, so it’s already packaged up and generalised as ‘fmap’, a.k.a. ‘<$>’</div>
<div dir="auto"><br>
</div>
<div dir="auto">fmap (1 +) (whereIsBM lx)</div>
<div dir="auto">-- or</div>
<div dir="auto">(1 +) <$> whereIsBM lx<br>
<br>
<div class="x_gmail_quote" dir="auto">
<div dir="ltr" class="x_gmail_attr">On Sun, Mar 28, 2021, 8:13 PM Galaxy Being <<a href="mailto:borgauf@gmail.com" target="_blank">borgauf@gmail.com</a>> wrote:<br>
</div>
<blockquote class="x_gmail_quote" style="margin:0px 0px 0px 0.8ex; border-left:1px solid rgb(204,204,204); padding-left:1ex">
<div dir="ltr">I've got this 
<div><br>
</div>
<div><font face="monospace">import Data.Maybe<br>
<br>
data MyList a = Empty | Cons a (MyList a) deriving (Eq,Ord,Show)<br>
data BaconOrIndex = Bacon | Indx Int deriving (Eq,Ord,Show)<br>
<br>
whereIsBM Empty = Nothing<br>
whereIsBM (Cons idx lx) = if (idx == Bacon) then Just 1 else (whereIsBM lx)</font><br>
</div>
<div><br>
</div>
<div>which I would like to tell me where the <font face="monospace">Bacon</font> is (index), not just if there's
<font face="monospace">Bacon,</font> which is what it does now. That is, I need this to happen</div>
<div><br>
</div>
<div>> <font face="monospace">whereIsBM (Cons (Indx 5) (Cons Bacon (Cons (Indx 2) (Cons (Indx 8) Empty))))<br>
</font></div>
<div><font face="monospace">Just 2</font></div>
<div><br>
</div>
<div>So I need to traverse a <font face="monospace">BaconOrIndex</font> list and count how deep I went to find the
<font face="monospace">Bacon</font> variable. I get the above code to evaluate error-free, but obviously I'm only returning a
<font face="monospace">Just 1 </font><font face="arial, sans-serif">when it sees </font>
<font face="monospace">Bacon</font><font face="arial, sans-serif">. What I need is to have the last part be</font></div>
<div><font face="arial, sans-serif"><br>
</font></div>
<div><font face="arial, sans-serif"> </font><font face="monospace">. . . else (1 + whereIsBM lx)</font></div>
<div><br>
</div>
<div> work; but it keeps giving the error<br>
</div>
<div><br>
</div>
<div><font face="monospace">Non type-variable argument in the constraint: Num (Maybe a)<br>
      (Use FlexibleContexts to permit this)<br>
    • When checking the inferred type<br>
        whereIsBM :: forall a.<br>
                     (Num a, Num (Maybe a)) =><br>
                     MyList BaconOrIndex -> Maybe a</font><br>
</div>
<div><br>
</div>
<div>I haven't a clue what this means. Eventually, I'll wrap this in something that handles the
<font face="monospace">Nothing</font> and  does <font face="monospace">fromJust </font>
on the alternative. This whole effort is because if I didn't use the <font face="monospace">
Maybe</font> strategy, and said </div>
<div><br>
</div>
<div><font face="monospace">whereIsBM Empty = 0</font></div>
<div><font face="monospace">...</font></div>
<div><br>
</div>
<div>it would never give back <font face="monospace">0</font> if it didn't find <font face="monospace">
Bacon</font>, rather, it would simply return the whole countdown to <font face="monospace">
Empty</font>. What can I do to make <font face="monospace">Maybe </font>work here?<br>
</div>
<div><br>
</div>
<div>LB</div>
</div>
_______________________________________________<br>
Haskell-Cafe mailing list<br>
To (un)subscribe, modify options or view archives go to:<br>
<a href="http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe" rel="noreferrer noreferrer" target="_blank">http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe</a><br>
Only members subscribed via the mailman list are allowed to post.</blockquote>
</div>
</div>
</div>
</blockquote>
</div>
</div>
</div>
The University of Edinburgh is a charitable body, registered in Scotland, with registration number SC005336. Is e buidheann carthannais a th’ ann an Oilthigh Dhůn Čideann, clŕraichte an Alba, ŕireamh clŕraidh SC005336.
</body>
</html>