<div dir="ltr">The more precise answer to your question is that an explicit type signature is taken as exact. If the type needed is some (Ctx a => a), as here, but your type signature just says a, you will get a type error exactly as you did.<div><br></div><div>"a" there does not mean "figure out a type for me". It means *any type at all*. Including Void, (), Int, etc., which one would not expect to work there.</div></div><div class="gmail_extra"><br><div class="gmail_quote">On Fri, Apr 20, 2018 at 2:33 PM, Marc Busqué <span dir="ltr"><<a href="mailto:marc@lamarciana.com" target="_blank">marc@lamarciana.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi!<br>
<br>
I'm using [selda](<a href="https://hackage.haskell.org/package/selda" rel="noreferrer" target="_blank">https://hackage.haskel<wbr>l.org/package/selda</a>) package in<br>
order to deal with database backends.<br>
<br>
Selda uses `TypeOperators` language extension, and it introduces  `:*:`<br>
type operator constructor which take concrete types like `RowID` or<br>
`Text` . It also has a `Table` type constructor which takes anything<br>
built with `:*:`). On the other hand, `SeldaM` is selda custom monad<br>
transformer with `IO` at the bottom.<br>
<br>
I have following helper function which just wraps a call to the SQLite<br>
backend. `dBPath` is just the database file path:<br>
<br>
```<br>
withDB :: SeldaM a -> IO a<br>
withDB act = do<br>
  path <- dBPath<br>
  withSQLite path act<br>
```<br>
<br>
I want to wrap selda API in custom functions to be more resilient to<br>
changes. Right now I'm trying to abstract selecting all rows for a given<br>
table (maybe it seems brittle, but it is just a toy project in order to<br>
learn Haskell):<br>
<br>
```<br>
list table = withDB $ query (select table) ```<br>
<br>
Not adding a type signature to `list` produces following compilation<br>
error:<br>
<br>
```<br>
• Non type-variable argument<br>
    in the constraint: selda-0.1.12.1:Database.Selda.<wbr>Column.Columns<br>
                         (selda-0.1.12.1:Database.Seld<wbr>a.Column.Cols s a)<br>
  (Use FlexibleContexts to permit this)<br>
• When checking the inferred type<br>
    list :: forall s a.<br>
            (selda-0.1.12.1:Database.Selda<wbr>.Column.Columns<br>
               (selda-0.1.12.1:Database.Seld<wbr>a.Column.Cols s a),<br>
             selda-0.1.12.1:Database.<wbr>Selda.Compile.Result<br>
               (selda-0.1.12.1:Database.Seld<wbr>a.Column.Cols s a)) =><br>
            Table a<br>
            -> IO<br>
                 [selda-0.1.12.1:Database.Seld<wbr>a.Compile.Res<br>
                    (selda-0.1.12.1:Database.Selda<wbr>.Column.Cols s a)]<br>
```<br>
<br>
If I try to add what I think would be the correct signature:<br>
<br>
```<br>
list :: Table a -> IO [a]<br>
```<br>
<br>
The error changes to:<br>
<br>
```<br>
• Couldn't match type ‘a’<br>
                 with ‘selda-0.1.12.1:Database.Selda<wbr>.Compile.Res<br>
                         (selda-0.1.12.1:Database.Seld<wbr>a.Column.Cols s0 a)’<br>
  ‘a’ is a rigid type variable bound by<br>
    the type signature for:<br>
      list :: forall a. Table a -> IO [a]<br>
    at src/Hedger/Category.hs:35:1-25<br>
  Expected type: SeldaM [a]<br>
    Actual type: selda-0.1.12.1:Database.Selda.<wbr>Backend.Internal.SeldaT<br>
                   IO<br>
                   [selda-0.1.12.1:Database.Seld<wbr>a.Compile.Res<br>
                      (selda-0.1.12.1:Database.Selda<wbr>.Column.Cols s0 a)]<br>
• In the second argument of ‘($)’, namely ‘query (select table)’<br>
  In the expression: withDB $ query (select table)<br>
  In an equation for ‘list’:<br>
      list table = withDB $ query (select table)<br>
• Relevant bindings include<br>
    table :: Table a (bound at src/Hedger/Category.hs:36:6)<br>
    list :: Table a -> IO [a] (bound at src/Hedger/Category.hs:36:1)<br>
   |<br>
36 | list table = withDB $ query (select table)<br>
```<br>
<br>
However, if I constraint the type signature to act just for a given<br>
table, it compiles without errors:<br>
<br>
```<br>
type CategoriesSchema = RowID:*:Text<br>
list :: Table CategoriesSchema -> IO [CategoriesSchema]<br>
```<br>
<br>
Why is that it works with concrete types but not with a type variable<br>
that takes the same concrete type in its both placeholders?<br>
<br>
Thanks in advance,<br>
<br>
Marc Busqué<br>
<a href="http://waiting-for-dev.github.io/about/" rel="noreferrer" target="_blank">http://waiting-for-dev.github.<wbr>io/about/</a><br>______________________________<wbr>_________________<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" target="_blank">http://mail.haskell.org/cgi-<wbr>bin/mailman/listinfo/haskell-<wbr>cafe</a><br>
Only members subscribed via the mailman list are allowed to post.<br></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature" data-smartmail="gmail_signature"><div dir="ltr"><div>brandon s allbery kf8nh                               sine nomine associates</div><div><a href="mailto:allbery.b@gmail.com" target="_blank">allbery.b@gmail.com</a>                                  <a href="mailto:ballbery@sinenomine.net" target="_blank">ballbery@sinenomine.net</a></div><div>unix, openafs, kerberos, infrastructure, xmonad        <a href="http://sinenomine.net" target="_blank">http://sinenomine.net</a></div></div></div>
</div>