<div dir="ltr">I see, thanks! And I guess that if the type variable c in your type of g were changed to b, it will still work, but now g would have a monomorphic instead of polymorphic type. I hope the combination of keywords in my subject line can serve to direct someone else with this problem to your answer!<div><div><br></div><div>Todd Wilson</div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Nov 24, 2020 at 2:37 PM Adam Gundry <<a href="mailto:adam@well-typed.com">adam@well-typed.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Dear Todd,<br>
<br>
On 24/11/2020 22:26, Todd Wilson wrote:<br>
> This has got to be a trivial question, but I don't see a solution, nor<br>
> could I find anything through searching: If I want to write a type<br>
> declaration for the helper function g here, what do I write?<br>
> <br>
>     f :: a -> [b] -> [(a,b)]<br>
>     f a bs = g bs where<br>
>       g :: ????<br>
>       g [] = []<br>
>       g (x:xs) = (a,x) : g xs<br>
<br>
This has a disappointingly not-entirely-trivial answer:<br>
<br>
    {-# LANGUAGE ExplicitForAll, ScopedTypeVariables #-}<br>
<br>
    f :: forall a b . a -> [b] -> [(a,b)]<br>
    f a bs = g bs where<br>
      g :: [c] -> [(a, c)]<br>
      g [] = []<br>
      g (x:xs) = (a,x) : g xs<br>
<br>
We need the type variable `a` in the type of `g` to be the same as the<br>
one bound in the type of `f`, but Haskell2010 doesn't have a way to<br>
express this. The ScopedTypeVariables extension, when used with an<br>
explicit forall, makes the type variables scope over type signatures in<br>
the body of the function.<br>
<br>
Hope this helps,<br>
<br>
Adam<br>
<br>
-- <br>
Adam Gundry, Haskell Consultant<br>
Well-Typed LLP, <a href="https://www.well-typed.com/" rel="noreferrer" target="_blank">https://www.well-typed.com/</a><br>
<br>
Registered in England & Wales, OC335890<br>
118 Wymering Mansions, Wymering Road, London W9 2NF, England<br>
</blockquote></div>