定义中的平等(可判定的相等性?例如,替换列表中的元素)

时间:2017-11-14 19:49:01

标签: typeclass lean

我正在尝试学习lean并希望定义一个替换函数,该函数使用两个元素xy,并将x的每次出现替换为{{1}在给定的列表中。

我试着像这样定义:

y

这给了我以下错误:

def replace {α : Type}: α -> α -> list α -> list α
| a b [] := []
| a b (x::xs) := (if a = x then b else x) :: replace a b xs

我的问题是我不能对类型error: failed to synthesize type class instance for α : Type, replace : α → α → list α → list α, a b x : α, xs : list α ⊢ decidable (a = x) 使用相等,所以我想我需要将α限制为某种类型的类,其中相等是可判定的(就像我在Haskell中所做的那样)。我怎么能这样做?

我当前的解决方法是将等于函数作为参数:

α

1 个答案:

答案 0 :(得分:3)

您可以将α的可判定等式作为类型类参数,如下所示:

def replace {α : Type} [decidable_eq α] : α -> α -> list α -> list α
| a b [] := []
| a b (x::xs) := (if a = x then b else x) :: replace a b xs

#eval replace 2 3 [2, 2, 5, 6, 3, 2]

方括号表示类型类的实例应该通过类型类解析来推断。