我该如何简化这种类型?

时间:2012-02-21 19:59:30

标签: types functional-programming coq dependent-type

liftM2 {A B R : Set} {m} {x : Monad m} (f : A -> B -> R) (ma : m A) (mb : m B) : (m R)

有没有减少这种类型的技巧?我在那里有一个多余的x

Monad是一个类型类:(Set -> Set) -> Type

2 个答案:

答案 0 :(得分:6)

liftM2 {A B R : Set} `{Monad m} (f : A -> B -> R) (ma : m A) (mb : m B) : (m R)

liftM2 `{Monad m} `(f : A -> B -> R) (ma : m A) (mb : m B) : (m R)

第二个改变隐式参数的顺序,但我认为这是合理的。

有关`{}语法的说明,请参阅here。主要区别在于名称,而不是类型是可选的。另外,参数的隐式行为在`{}内部是奇怪的,除非 你用!。

开始这个类型

答案 1 :(得分:4)

这个更短但不太有用......

liftM2 {A B R} {m} : Monad m -> (A -> B -> R) -> m A -> m B -> m R.

我不明白你为什么要这么短或者需要这么短。每件事都有它的重要性,而且几乎所有的名字都有助于阅读它。

这个liftM2看起来尽可能轻。

但是,如果要定义许多共享某些参数的函数,则可以在一个部分中定义它,在该部分中可以使用参数。例如,请看这里如何定义liftM2:

http://mattam.org/repos/coq/oldprelude/Monad.v

mon : Monad m在部分内部定义,并将传递给实际使用它的所有函数。关闭该部分后,您可以检查签名以确定它实际已通过。