Zulip Chat Archive

Stream: new members

Topic: Type error in Functional Programming In Lean


Lars Ericson (Jul 16 2023 at 15:06):

@David Thrane Christiansen , the section "Controlling Instance Search" in Functional Programming in Lean appears to have
Screenshot-from-2023-07-16-11-05-42.png
a coding error in this example:

structure Pos where
  succ :: pred : Nat

def addNatPos : Nat  Pos  Pos
  | Nat.zero, p => p
  | Nat.succ n, p => Pos.succ (addNatPos n p)

The error is that Pos.succ takes a Nat but addNatPos n p is a Pos. Please also attached screenshot.

The following alternate definition of addNatPos works but requires a little more buildup:

structure Pos where
  succ :: pred : Nat

class Plus (α : Type) where
  plus : α  α  α

def Nat.plus : Nat  Nat  Nat
  | 0, k => k
  | n+1, k => (n.plus k) + 1

def Pos.plus : Pos  Pos  Pos
  | Pos.succ a, Pos.succ b => Pos.succ (a + b + 1)

instance : Plus Pos where
  plus := Pos.plus

instance : Add Pos where
  add := Pos.plus

def addNatPos : Nat  Pos  Pos
  | Nat.zero, p => p
  | Nat.succ n, p => Pos.plus (Pos.succ n) p

def addPosNat : Pos  Nat  Pos
  | p, 0 => p
  | p, n + 1 => Pos.plus p (Pos.succ n)

#check addPosNat (Pos.succ 1) (Nat.succ 0)

David Thrane Christiansen (Aug 06 2023 at 19:26):

The Pos.succ here is the one from this definition:

  inductive Pos : Type where
    | one : Pos
    | succ : Pos  Pos

The structure that you have here is part of an exercise on other ways to do it, not the main one in the chapter.

How could this have been more clear?


Last updated: Dec 20 2023 at 11:08 UTC