Idris2-boot icon indicating copy to clipboard operation
Idris2-boot copied to clipboard

Implicits in Interface Functions cause Typecheck Error

Open fabianhjr opened this issue 5 years ago • 5 comments

Steps to Reproduce

module Test

interface Foo a where
  bar : a -> {auto ok: ()} -> a 

Expected Behavior

Typecheck (Like Idris1)

Observed Behavior

1/1: Building Test (Test.idr)
Test.idr:4:3--5:1:While processing left hand side of bar at Test.idr:4:3--5:1:
ok is not a valid implicit argument in bar

Edit: maybe related to #8, however I couldn't change it to a constraint as a workaround since I was restricting the domain of a division to nonzero elements.

fabianhjr avatar Apr 29 '20 03:04 fabianhjr

The following rewrite doesn't give a type error:

module Foo

interface Foo a where
  bar : {auto ok: ()} -> a -> a

perhaps the implicit argument needs to be the first.

rgrover avatar Apr 29 '20 03:04 rgrover

@rgrover, the issue is that I was working on div/mod and wanted to remove the ring's zero:

div : (n, d: a) -> {auto ok: d `NEQ` Semiring.zero} -> a

(I did check the issue #8 with the constraint workaround suggestion)

fabianhjr avatar Apr 29 '20 03:04 fabianhjr

Could the style in https://github.com/edwinb/Idris2/blob/master/libs/base/Data/Nat.idr#L191 work for you?

rgrover avatar Apr 29 '20 03:04 rgrover

Well, it would typecheck but so would any usages of div that didn't verify that they weren't dividing by zero. (Or ask for such a proof explicitly when it could attempt to derive it)

fabianhjr avatar Apr 29 '20 04:04 fabianhjr

div : (n, d: a) -> Not (d = Semiring.zero) -> a

rgrover avatar Apr 29 '20 04:04 rgrover