在 Idris 中多行写入函数类型

Write function type on multiple lines in Idris

如何在 Idris 中将类型声明拆分为多行?类型应该驱动开发。所以它们可能会变得很长并且不适合屏幕。喜欢这个:

addMatrices : (augent : Vect rowCount (Vect columnCount element)) -> (addend: Vect rowCount (Vect columnCount element)) -> Vect rowCount (Vect columnCount element)

我在检查 Atom 中的类型时弄明白了:

addMatrices : (augent : Vect rowCount (Vect columnCount element)) -> 
              (addend: Vect rowCount (Vect columnCount element)) -> 
              Vect rowCount (Vect columnCount element)

如果只是格式化,你可以按照你做的来做,

addMatrices : (augent : Vect rowCount (Vect columnCount element)) -> 
              (addend: Vect rowCount (Vect columnCount element)) -> 
              Vect rowCount (Vect columnCount element)

docs

New declarations must begin at the same level of indentation as the preceding declaration.

同样,book只说了,在第2.4.1节Whitespace significance: the layout rule,

... in any list of definitions and declarations, all must begin in precisely the same column.

由于新行不是新声明,我认为这意味着新行可以从任何缩进级别开始,所以

addMatrices : (augent : Vect rowCount (Vect columnCount element)) -> 
       (addend: Vect rowCount (Vect columnCount element)) -> 
          Vect rowCount (Vect columnCount element)

其他变体也有效。

或者,根据 Al.G. 的评论,您可以使用类型别名,但如果 rowCountcolumnCount 不在范围内,我猜测它们不适合您,您将需要一个类型级函数,它是类型别名的概括。 returns 是一个类型的函数。

Matrix : Nat -> Nat -> Type -> Type
Matrix rows cols elem = Vect rows (Vect cols elem)

那么你将拥有

addMatrices : (augent : Matrix rowCount columnCount element) -> 
              (addend: Matrix rowCount columnCount element) -> 
              Matrix rowCount columnCount element

并没有短很多。

老实说,我会考虑使用较短的名称并利用任何明显的上下文

addMatrices : (augent : Vect r (Vect c elem)) -> (addend: Vect r (Vect c elem)) -> Vect r (Vect c elem)