<div dir="ltr"><div style><span style="font-family:arial,sans-serif;font-size:13px">(For some reason my previous post seems to have been truncated.)</span></div><span style="font-family:arial,sans-serif;font-size:13px"><div>
<span style="font-family:arial,sans-serif;font-size:13px"><br></span></div>I have a function that, simplifying a little, looks like this:</span><div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px">
  fn :: [a] -&gt; a</div><div style="font-family:arial,sans-serif;font-size:13px">  fn = (head .) . takeWhile $ (\_ -&gt; True)</div><div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px">
>From this, I want a function with the signature fn&#39; :: [(x,a)] -&gt; (x,a) such that:</div><div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px">    snd $ fn&#39; (zip [x] [a]) = fn [a]</div>
<div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px">I can see ways of doing this by altering fn, or by repeating some of fn in the definition of fn&#39;, or (because in this case I know that if fn xs = x, fn is returning the first x in xs and not any others), by doing something nasty like:</div>
<div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px">  fn&#39; xs = xs !! fromMaybe 0 (findIndex (\(_,a) -&gt; a == fn (snd $ unzip xs)) xs )<br></div>
<div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px">But it seems to me like there should be prettier solutions to this (that <i>do not</i> involve changing the definition of fn). After all, this doesn&#39;t seem like a rare pattern.</div>
<div style="font-family:arial,sans-serif;font-size:13px"><br></div><div style="font-family:arial,sans-serif;font-size:13px">Anyone know if in fact there&#39;s a better way to go about it?</div></div>