Library for when you want to expect that something is inferred correctly. This library is not commonly useful.
class ExpectInferred expected actual
No fundeps, so both have to be determined to match anything, which means that in PureScript, you have to let-bind your intermediate actual results.
expectInferred :: forall expected actual . ExpectInferred expected actual => Proxy expected -> actual -> Unit expectInferred _ _ = unit
Given some class and some of its methods:
class SimpleClass a b | a -> b where simpleMethod :: Proxy a -> b instance simpleInstance1 :: SimpleClass Int String where simpleMethod _ = "hello" instance simpleInstance2 :: SimpleClass String Unit where simpleMethod _ = unit
We can see usage as expected:
test1 :: Unit test1 = let expectedP = Proxy :: Proxy String simpleValue = simpleMethod (Proxy :: Proxy Int) in expectInferred expectedP simpleValue
Then, when we put the wrong thing in:
test2 :: Unit test2 = let -- this will error correctly: expectedP = Proxy :: Proxy String -- A custom type error occurred while solving type class constraints: -- -- The expected (first) and actual (second) types did not match: -- String -- Unit -- -- while applying a function expectInferred -- of type ExpectInferred t0 t1 => Proxy t0 -> t1 -> Unit -- to argument expectedP -- while inferring the type of expectInferred expectedP -- in value declaration test2 simpleValue = simpleMethod (Proxy :: Proxy String) in expectInferred expectedP simpleValue