在 Haskell 中,您可以通过左侧构造函数进行模式匹配的方程来定义算法。例如:
data Nat = S Nat | Z
double :: Nat -> Nat
double Z = Z
double (S x) = S (S x)
现在,想象一下 constructor 限制被取消,并且我们允许任意左侧:
foo :: Nat -> Nat
foo (double x) = x + 1
在这种情况下,我们不是匹配 x
的
successor,而是匹配
x
的 double,其中
double
是任意函数,而不是构造函数。因此,要计算 foo 10
,运行时需要将其与 foo (double x)
进行匹配,通过统一,这意味着 x = 5
,因此,foo (double 5) = foo 10 = 5 + 1 = 6
;即 6
是最终结果。当然,这个想法不切实际,因为:
计算需要统一,这使得语言变得极其缓慢。
可能会写出荒谬的方程,因此必须以某种方式处理。
然而,这个概念是否已经在任何现有语言中被探索和/或实现了?
foo (x*y) = (x, y)
print $ foo 2519590847565789349402718324004839857142928212620403202777713783604366202070\
7595556264018525880784406918290641249515082189298559149176184502808489120072\
8449926873928072877767359714183472702618963750149718246911650776133798590957\
0009733045974880842840179742910064245869181719511874612151517265463228221686\
9987549182422433637259085141865462043576798423387184774447920739934236584823\
8242811981638150106748104516603773060562016196762561338441436038339044149526\
3443219011465754445417842402092461651572335077870774981712577246796292638635\
6373289912154831438167899885040445364023527381951378636564391212010397122822\
120720357