在类似Haskell的语言中定义多变量函数与部分函数

问题描述 投票:2回答:1

所以我实际上是通过一定程度上遵循布雷迪的Idris的类型驱动开发来修改Idris语言的。我不认为我在这里写的是与特定的编程语言绑定的(就此而言,我不知道任何Haskell)。但是我不知道该在哪里发布,因为我不了解部分函数/类型/ lambda和从数学家的角度看待的所有东西。某些上下文

在本书的第二章中,作者提请注意以下情况。

给出自我解释的摘录

double : Num a => a -> a double x = x + x rotate : Shape -> Shape

其中Shape : Typerotate是用于形状类型的孔和用于将Shape分别旋转90度的函数,quadrupleturn-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术语,而是将其具体化。

  1. 假设我们有一个“多变量”功能

    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时?

  2. 有人可以澄清我上面报告的两种方法(布雷迪和我的)之间的区别吗?

  3. 1
是的,我是一名数学系学生...所以我实际上是通过遵循Brady的Idris类型驱动开发来修补Idris语言。我不认为我在这里写的是与特定编程语言绑定的(...
haskell idris
1个回答
0
投票
没有明确的“规则”来告知何时应使用一种样式而不是另一种样式。

一个功能定义为

© www.soinside.com 2019 - 2024. All rights reserved.