[Haskell-cafe] inference with implicitparams seems broken

rowan goemans goemansrowan at gmail.com
Thu Mar 24 13:04:34 UTC 2022


Indeed, with the monomorphism restriction disabled it works without 
issues. is this by design/expected though? Morally I feel it is already 
monomorph, it's just missing an argument which needs to be provided. 
Would there be interest in fixing this in GHC?

On 3/23/22 15:56, J. Reinders wrote:
> It’s due to the monomorphism restriction [1]. If you give `baz` an argument it does infer the type correctly:
>
> ```
> foo :: Int
> foo = bar
>    where
>      bar = withX 42 (baz ())
>      baz () = somethingThanNeedsX
> ```
>
> Or you can disable the monomorphism restriction:
>
> ```
> {-# LANGUAGE NoMonomorphismRestriction #-}
> ```
>
> [1] https://wiki.haskell.org/Monomorphism_restriction
>
>> On 23 Mar 2022, at 15:48, rowan goemans <goemansrowan at gmail.com> wrote:
>>
>> Hello everyone,
>>
>> I wonder why the following taken from an stackoverflow answer doesn't work: https://stackoverflow.com/questions/71184922/is-it-possible-to-infer-a-type-that-is-a-reflection-like-closure. Code of the answer posted here verbatim:
>>
>> ```
>> {-# LANGUAGE ImplicitParams #-}
>> {-# LANGUAGE RankNTypes #-}
>>
>> module Temp where
>>
>> withX :: Int -> ((?x :: Int) => r) -> r
>> withX x r =
>>    let ?x = x
>>    in r
>>
>> somethingThanNeedsX :: (?x :: Int) => Int
>> somethingThanNeedsX = ?x + 2
>>
>> foo :: Int
>> foo = bar
>>    where
>>      bar = withX 42 baz
>>
>>      baz = somethingThanNeedsX
>> ```
>>
>> This won't compile with the error message:
>>
>> ```
>> Orig.hs:19:11: error:
>>      • Unbound implicit parameter (?x::Int)
>>          arising from a use of ‘somethingThanNeedsX’
>>      • In the expression: somethingThanNeedsX
>>        In an equation for ‘baz’: baz = somethingThanNeedsX
>>        In an equation for ‘foo’:
>>            foo
>>              = bar
>>              where
>>                  bar = withX 42 baz
>>                  baz = somethingThanNeedsX
>>     |
>> 19 |     baz = somethingThanNeedsX
>> ```
>>
>> If you give `baz` a type signature which includes the implicit param it compiles. But I think this is a bug. GHC should not require a type signature here. I tried searching for a GHC ticket but I couldn't find one. But that might also be down to me not using the right query.
>>
>> Anyway my question is, is this expected behavior? This really makes implicit params less ergonomic.
>>
>> Best regards,
>>
>> Rowan Goemans
>>
>> _______________________________________________
>> Haskell-Cafe mailing list
>> To (un)subscribe, modify options or view archives go to:
>> http://mail.haskell.org/cgi-bin/mailman/listinfo/haskell-cafe
>> Only members subscribed via the mailman list are allowed to post.


More information about the Haskell-Cafe mailing list