所以我实际上是通过一定程度上遵循布雷迪的Idris的类型驱动开发来修改Idris语言的。我不认为我在这里写的是与特定的编程语言绑定的(就此而言,我不知道任何Haskell)。但是我不知道该在哪里发布,因为我不了解部分函数/类型/ lambda和从数学家的角度看待的所有东西。某些上下文
给出自我解释的摘录
double : Num a => a -> a double x = x + x rotate : Shape -> Shape
其中Shape : Type
和rotate
是用于形状类型的孔和用于将Shape
分别旋转90度的函数,quadruple
和turn-around
函数后面有明显的图案] >
quadruple : Num a => a -> a quadruple x = double (double x) turn_around : Shape -> Shape turn around x = rotate (rotate x)
这使我们编写了能够应用相同运算符两次的twice
(高阶)函数。在我看来,解决问题的方法主要有两种。首先只是遵循布雷迪的代码
twice : (ty -> ty) -> ty -> ty twice f x = f (f x)
他实际上在任意第二个,在我看来似乎更优雅一点,是通过twice f : ty -> ty
1
上定义twice
函数的图像f
的位置。
twice
函数和/或匿名函数,通过稍微改变其签名来定义composite
twice : (ty -> ty) -> ty
twice f = composite f f
composite : (ty_2 -> ty_3) -> (ty_1 - ty_2) -> (ty_1 -> ty_3)
composite g f = \x => g (f x)
两种方法都能得出最终结果
turn_around : Shape -> Shape turn_around = twice rotate
问题我将尽力使问题保持清晰,因此,我不会误解通用的compsci术语,而是将其具体化。
f : ty_1 -> ty_2 -> ... -> ty_n
然后f
是将x_1 : ty_1
带到另一个功能f x_1 : ty_1 -> ... -> ty_n
的功能。我们什么时候应该选择写
f x_1 = stuff
代替
f x_1 ... x_{n-2} = stuff2
当我们定义f
时?
一个功能定义为