4.6.Β Additional Conveniences
4.6.1.Β Shared Argument Types
κ°μ νμ μ κ°λ μ¬λ¬ μΈμλ₯Ό λ°λ ν¨μλ₯Ό μ μν λλ κ°μ μ½λ‘ μμ μΈμλ₯Ό ν¨κ» μΈ μ μλ€. μλ₯Ό λ€μ΄ λ€μκ³Ό κ°λ€.
def equal? [BEq Ξ±] (x : Ξ±) (y : Ξ±) : Option Ξ± :=
if x == y then
some x
else
noneλ€μμ²λΌ μΈ μλ μλ€.
def equal? [BEq Ξ±] (x y : Ξ±) : Option Ξ± :=
if x == y then
some x
else
noneμ΄λ νμ μλͺ μ΄ ν΄ λ νΉν μ μ©νλ€.
4.6.2.Β Leading Dot Notation
κ·λ© νμ μ μμ±μλ λ€μμ€νμ΄μ€ μμ μλ€. μ΄ λλΆμ μλ‘ κ΄λ ¨λ μ¬λ¬ κ·λ© νμ μ΄ κ°μ μμ±μ μ΄λ¦μ μ¬μ©ν μ μμ§λ§, νλ‘κ·Έλ¨μ΄ μ₯ν©ν΄μ§ μ μλ€. ν΄λΉ κ·λ© νμ μ μκ³ μλ λ¬Έλ§₯μμλ μμ±μ μ΄λ¦ μμ μ μ λΆμ¬ λ€μμ€νμ΄μ€λ₯Ό μλ΅ν μ μμΌλ©°, Leanμ μμ νμ μ μ¬μ©ν΄ μμ±μ μ΄λ¦μ κ²°μ νλ€. μλ₯Ό λ€μ΄ μ΄μ§ νΈλ¦¬λ₯Ό λμΉμν€λ ν¨μλ λ€μμ²λΌ μΈ μ μλ€.
def BinTree.mirror : BinTree Ξ± β BinTree Ξ±
| BinTree.leaf => BinTree.leaf
| BinTree.branch l x r => BinTree.branch (mirror r) x (mirror l)λ€μμ€νμ΄μ€λ₯Ό μλ΅νλ©΄ ν¨μ¬ μ§§μμ§μ§λ§, Lean μ»΄νμΌλ¬λ₯Ό ν¬ν¨νμ§ μλ μ½λ 리뷰 λꡬ κ°μ λ¬Έλ§₯μμλ νλ‘κ·Έλ¨μ μ½κΈ° μ΄λ €μμ§λ€λ λκ°κ° λ°λ₯Έλ€.
def BinTree.mirror : BinTree Ξ± β BinTree Ξ±
| .leaf => .leaf
| .branch l x r => .branch (mirror r) x (mirror l)
μμ μμ νμ
μΌλ‘ λ€μμ€νμ΄μ€λ₯Ό ꡬλΆνλ λ°©λ²μ μμ±μκ° μλ μ΄λ¦μλ μ μ©ν μ μλ€.
BinTree.emptyλ₯Ό BinTreeλ₯Ό λ§λλ λ€λ₯Έ λ°©λ²μΌλ‘ μ μνλ©΄ μ νκΈ°λ²μΌλ‘λ μ¬μ©ν μ μλ€.
def BinTree.empty : BinTree Ξ± := .leaf#check (.empty : BinTree Nat)4.6.3.Β Or-Patterns
match μμ²λΌ μ¬λ¬ ν¨ν΄μ νμ©νλ λ¬Έλ§₯μμλ μ¬λ¬ ν¨ν΄μ΄ κ²°κ³Ό μμ 곡μ ν μ μλ€.
μμΌμ λνλ΄λ λ°μ΄ν° νμ
Weekdayλ₯Ό 보μ.
inductive Weekday where
| monday
| tuesday
| wednesday
| thursday
| friday
| saturday
| sunday
deriving Reprν¨ν΄ λ§€μΉμ μ¬μ©ν΄ μ΄λ€ λ μ΄ μ£Όλ§μΈμ§ κ²μ¬ν μ μλ€.
def Weekday.isWeekend (day : Weekday) : Bool :=
match day with
| Weekday.saturday => true
| Weekday.sunday => true
| _ => falseμμ±μ μ νκΈ°λ²μ μ¬μ©νλ©΄ μ΄λ₯Ό μ΄λ―Έ κ°μνν μ μλ€.
def Weekday.isWeekend (day : Weekday) : Bool :=
match day with
| .saturday => true
| .sunday => true
| _ => false
λ μ£Όλ§ ν¨ν΄μ κ²°κ³Ό μμ΄ λͺ¨λ (true)λ‘ κ°μΌλ―λ‘ νλλ‘ ν©μΉ μ μλ€.
def Weekday.isWeekend (day : Weekday) : Bool :=
match day with
| .saturday | .sunday => true
| _ => falseμΈμμ μ΄λ¦μ λΆμ΄μ§ μλ λ²μ μΌλ‘ λ κ°μνν μλ μλ€.
def Weekday.isWeekend : Weekday β Bool
| .saturday | .sunday => true
| _ => false
λ΄λΆμ μΌλ‘λ κ° ν¨ν΄μ κ²°κ³Ό μμ λ¨μν 볡μ νλ€.
λ°λΌμ ν¨ν΄μ΄ λ³μλ₯Ό λ°μΈλ©ν μ μλ€. λ€μ μμ μμλ λ μμ±μκ° κ°μ νμ
μ κ°μ λ΄λ ν© νμ
μμ inlκ³Ό inr μμ±μλ₯Ό μ κ±°νλ€.
def condense : Ξ± β Ξ± β Ξ±
| .inl x | .inr x => xκ²°κ³Ό μμ 볡μ νλ―λ‘ ν¨ν΄μ΄ λ°μΈλ©νλ λ³μλ€μ΄ κ°μ νμ μΌ νμλ μλ€. μ¬λ¬ νμ μ μλνλ μ€λ²λ‘λ©λ ν¨μλ₯Ό μ¬μ©νλ©΄ μλ‘ λ€λ₯Έ νμ μ λ³μλ₯Ό λ°μΈλ©νλ ν¨ν΄μ 곡ν΅μΌλ‘ μλνλ νλμ κ²°κ³Ό μμ μμ±ν μ μλ€.
def stringy : Nat β Weekday β String
| .inl x | .inr x => s!"It is {repr x}"
μ€μ λ‘λ λͺ¨λ ν¨ν΄μ 곡μ λ λ³μλ§ κ²°κ³Ό μμμ μ°Έμ‘°ν μ μλ€. κ° ν¨ν΄μ λν΄ κ²°κ³Όκ° μλ―Έκ° μμ΄μΌ νκΈ° λλ¬Έμ΄λ€.
getTheNatμμλ nλ§ μ κ·Όν μ μμΌλ©° xλ yλ₯Ό μ¬μ©νλ € νλ©΄ μ€λ₯κ° λλ€.
def getTheNat : (Nat Γ Ξ±) β (Nat Γ Ξ²) β Nat
| .inl (n, x) | .inr (n, y) => n
λΉμ·ν μ μμμ xμ μ κ·Όνλ € νλ©΄ λ λ²μ§Έ ν¨ν΄μλ xκ° μμΌλ―λ‘ μ€λ₯κ° λλ€.
def getTheAlpha : (Nat Γ Ξ±) β (Nat Γ Ξ±) β Ξ±
| .inl (n, x) | .inr (n, y) => x
ν¨ν΄ λ§€μΉμ κ° λΆκΈ°μ κ²°κ³Ό μμ μ¬μ€μ 볡μ¬ν΄ λΆμΈλ€λ μ λλ¬Έμ λλΌμ΄ λμμ΄ μκΈΈ μ μλ€.
μλ₯Ό λ€μ΄ λ€μ μ μλ κ²°κ³Ό μμ inr λ²μ μ΄ μ μ μ μμΈ strλ₯Ό μ°Έμ‘°νλ―λ‘ νμ©λλ€.
def str := "Some string"
def getTheString : (Nat Γ String) β (Nat Γ Ξ²) β String
| .inl (n, str) | .inr (n, y) => str
λ μμ±μμ μ΄ ν¨μλ₯Ό νΈμΆνλ©΄ νΌλμ€λ¬μ΄ λμμ΄ λλ¬λλ€.
첫 λ²μ§Έ κ²½μ°μλ Ξ²κ° μ΄λ€ νμ
μ΄μ΄μΌ νλμ§ Leanμ μλ € μ£Όλ νμ
μ£Όμμ΄ νμνλ€.
#eval getTheString (.inl (20, "twenty") : (Nat Γ String) β (Nat Γ String))λ λ²μ§Έ κ²½μ°μλ μ μ μ μκ° μ¬μ©λλ€.
#eval getTheString (.inr (20, "twenty"))
Weekday.isWeekendμ²λΌ or ν¨ν΄μ μ¬μ©νλ©΄ μΌλΆ μ μλ₯Ό ν¬κ² κ°μννκ³ λͺ
ννκ² λ§λ€ μ μλ€.
νΌλμ€λ¬μ΄ λμμ΄ μκΈΈ κ°λ₯μ±μ΄ μμΌλ―λ‘, νΉν μ¬λ¬ νμ
μ λ³μλ μλ‘ κ²ΉμΉμ§ μλ λ³μ μ§ν©μ΄ κ΄λ ¨λ κ²½μ°μλ μ£Όμν΄μ μ¬μ©νλ κ²μ΄ μ’λ€.