Skip to content

Instantly share code, notes, and snippets.

@srghma
Last active August 20, 2021 19:18
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save srghma/e264aee6f985cdc275e76d9aae1c4083 to your computer and use it in GitHub Desktop.
Save srghma/e264aee6f985cdc275e76d9aae1c4083 to your computer and use it in GitHub Desktop.

original

data DoorState = Open | Closed

data Door : DoorState -> Type where
     MkDoor : (doorId : Int) -> Door st

openDoor : (1 d : Door Closed) -> Door Open

closeDoor : (1 d : Door Open) -> Door Closed

newDoor : (1 p : (1 d : Door Closed) -> IO ()) -> IO ()

deleteDoor : (1 d : Door Closed) -> IO ()


doorProg : IO ()
doorProg
    = newDoor $ \d => do
          let d' = openDoor d
              d'' = closeDoor d'
          deleteDoor d''

idris2 --check ./doorProg.idr
Error: While processing right hand side of doorProg. There are 2 uses of linear name d'.

./doorProg.idr:17:15--17:30
    |
 17 |           let d' = openDoor d
    |               ^^^^^^^^^^^^^^^

Suggestion: linearly bounded variables must be used exactly once.
data DoorState = Open | Closed

data Door : DoorState -> Type where
     MkDoor : (doorId : Int) -> Door st

openDoor : (1 d : Door Closed) -> Door Open

closeDoor : (1 d : Door Open) -> Door Closed

newDoor : (1 p : (1 d : Door Closed) -> IO ()) -> IO ()

deleteDoor : (1 d : Door Open) -> (1 d : Door Closed) -> IO ()

doorProg : IO ()
doorProg
    = newDoor $ \d => do
          let d' = openDoor d
              d'' = closeDoor d'
          deleteDoor d' d''

compiles as expected

data DoorState = Open | Closed

data Door : DoorState -> Type where
     MkDoor : (doorId : Int) -> Door st

openDoor : (1 d : Door Closed) -> Door Open

closeDoor : (1 d : Door Open) -> Door Closed

newDoor : (1 p : (1 d : Door Closed) -> IO ()) -> IO ()

deleteDoor : (0 d : Door Open) -> (1 d : Door Closed) -> IO ()

doorProg : IO ()
doorProg
    = newDoor $ \d => do
          let d' = openDoor d
              d'' = closeDoor d'
          deleteDoor d' d''
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment